все что связано с моей работой
Главная » Програмирование » SendMail. Часть 6

SendMail. Часть 6

Заканчиваем описывать наш класс. Две вспомогательные процедурки

procedure TSendMail.AddTo(AName, AEMail: string);
var s:string;
begin
  s:=Format('%s <%s>',[AName, AEMail]);
  if F_To.IndexOf(s)>0 then exit;
  F_To.Append(s);
end;

procedure TSendMail.AddFileName(aFileName: string);
begin
  if FAttachedFileName.IndexOf(aFileName)>0 then exit;
  if not FileExists(aFileName) then exit;
  FAttachedFileName.Append(aFileName);
end;

Как видно просто добавляют значения в списки, проверяя на дубликаты. Ну и для вложений проверяется наличие файла на диске, а для получателей формируется строка вида ИмяПолучателя адрес@электронной.почты

Функция Prepare должна создать письмо и все подготовить к отправке.

function TSendMail.Prepare: boolean;
var Root:TMimePart;
    i:integer;
begin
  Result:=False;
  try
    if FMsg<>nil then FreeAndNil(FMsg);
    if FSMTP<>nil then FreeAndNil(FSMTP);
    FMsg:=TMimeMess.Create;
    FMsg.Header.From:=Format('%s <%s>',[FFrom_Name, FFrom_EMail]);
    FMsg.Header.ToList.Assign(F_To);
    FMsg.Header.Subject:=Subject;
    Root:=FMsg.AddPartMultipart('alternative',nil);
    if FBody.Count>0 then Msg.AddPartMess(FBody,Root);
    for i:=0 to FAttachedFileName.Count-1 do
      FMsg.AddPartBinaryFromFile(FAttachedFileName[i],Root);
    Result:=true;
  finally
    FPrepared:=Result;
  end;
end; 

7 проверяем если у нас уже была отправка то удалить объект.

8-11 – создаем “сообщение” и заполняем заголовки.

12 создаем “корневое” (главное) вложение

13 если у нас есть “тело” письма, то добавляем его

14-15 Добавляем каждый вложенный файл, как часть письма

16 Если все прошло нормально то функция вернет “Истина”. Если на каком-то этапе будет ошибка, то функция вернет “Ложь” из 5й строки.

18 Устанавливаем Маркер “Подготовлено”

Ну и последняя, и можно сказать самая главная процедура:

function TSendMail.Send: boolean;
var
  s, t: string;
begin
  Result := False;
  FSMTP := TSMTPSend.Create;
  try
    FSMTP.TargetHost := FServer;
    FSMTP.TargetPort := IntToStr(FPort);
    FSMTP.Username := Username;
    FSMTP.Password := Password;
    if FSMTP.Login then
    begin
      if FSMTP.MailFrom(GetEmailAddr(FMsg.Header.From), Length(MailData.Text)) then
      begin
        s := FMsg.Header.ToList.CommaText;
        repeat
          t := GetEmailAddr(Trim(FetchEx(s, ',', '"')));
          if t <> '' then
            Result := FSMTP.MailTo(t);
          if not Result then
            Break;
        until s = '';
        if Result then
          Result := FSMTP.MailData(FMsg);
      end;
      FSMTP.Logout;
    end;
  finally
    FSMTP.Free;
  end;
end;          

Фактически это немного измененная библиотечная функция SendRaw. Все функции библиотеки требуют дополнительно указывать “От” и “Кому” зачем не совсем ясно, при том, что эта информация есть в сообщении. Ну хозяин барин, как говорится, а мы немного исправили код, чтоб у нас все необходимые параметры брались из тела сообщения.

P.S. Единственное, что вызывает опасения, это то, что в примере перед отправкой сообщение “кодируется” m.EncodeMessage, насколько это необходимо не ясно, покажут первые опыты.

Комментариев нет

No comments yet.

RSS feed for comments on this post.

Sorry, the comment form is closed at this time.