Команды SMTP небольшие, и с их отправкой не возникает проблем. Если строка больше, чем переменная, предназначенная для хранения отправляемых данных, то могут возникнуть трудности при передаче сообщений. В этом случае данные будут отправлены не полностью, и мы должны будем продолжить передачу с нужного места.

Давайте посмотрим на код, который отвечает за отправку строки:

TempStr := mmliessage Lines[i]+#13+#10;
while TempStr <> '' do
begin
CopyMemory(@sRecvBuff. PChar(TempStr). Length(TempStr)): IRet := send(sServerListen. sRecvBuff. Length(TempStr), 0): if iRet = SOCKETJRROR then break:
mmLog.Lines.Add('>'+Copy(TempStr. 1. Pos(#13. TempStr))): Delete(TempStr. 1. iRet):
end.

Отправляемое сообщение попадает в переменную TempStr. Эта переменная имеет тип AnsiString и может содержать строки до 2 гигабайт. Сеть не может сразу принять данные такого размера, поэтому приходится идти на ухищрения.

Для отправки мы запускаем цикл, который будет выполняться, пока все данные из перемен ной. TempStr не будут отправлены по сети. Внутри цикла данные пересылаются. Функция send возвращает действительное количество переданных по сети байтов. Это количество байтов удаляется из строки TempStr, и если она после этого не стала пустой, то отправлены не все данные и на следующем этане посылается остальная часть строки.

ПРИМЕЧАНИЕ--

Исходный код рассмотренного здесь примера находится на компакт-диске в каталоге Sources\ch05\SMTPCIient.

5.2.2. Реализация SMTP-клиента || Оглавление || 5.3. Отправка файлов по почте


Delphi в шутку и всерьез: что умеют хакеры



Новости за месяц

  • Декабрь
    2021
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31