Delphi — проверка почты (Часть 3)

Задача: Расширить возможности программы проверки почты, и добавить возможность сохранять вложенные файлы в папку и логировать выполненные операции. В данной части рассмотрим следующие вопросы:

  1. Сохранение вложенных файлов в папку
  2. Логирование обработанных сообщений

Инструментарий: Delphi XE, компоненты INDY v10, Библиотеки libeay32.dll и ssleay32.dll
Решение:

Предыдущая часть:
Проверка почты средствами Delphi — часть 1
Проверка почты средствами Delphi — часть 2

Предположим что в нас есть почтовый клиент, который должен проверять почту и сохранять все вложенные файлы в некую папку.
Приступим к реализации. Для того чтобы все работало, нам понадобится еще один компонент который находится на закладке Indy Misc под названием idMessage (Рис. 1)

Рис.1 Выбор компонента с Tool Palette

Рис.1 Выбор компонента с Tool Palette


Напишем процедуру для логирования принятых сообщений. Для простоты я буду выводить информацию о сообщениях в mmoResult (Memo в который пишется результат). Переходим в редактор кода и добавляем следующий код:

procedure TfrmMain.SaveToLog(idMessage: TidMessage);
begin
  mmoResult.Lines.Add(IdMessage1.UID); //Уникальный идентификатор сообщения, по нему можно разлечать новое письмо, или старое
  mmoResult.Lines.Add(IdMessage1.From.Text);
  mmoResult.Lines.Add(IdMessage1.Recipients.EmailAddresses);
  mmoResult.Lines.Add(IdMessage1.CCList.EMailAddresses);
  mmoResult.Lines.Add(IdMessage1.Subject);
  mmoResult.Lines.Add(FormatDateTime('dd mmm yyyy hh:mm:ss', IdMessage1.Date));
  mmoResult.Lines.Add(IdMessage1.ReceiptRecipient.Text);
  mmoResult.Lines.Add(IdMessage1.Organization);
end;

Добавляем объявление процедуры в секцию private класса главной формы:

private
  …
  procedure SetupSSL;
  procedure SaveToLog(idMessage: TidMessage);
publiс

Дальше переходим в процедуру проверки почты CheckMail(IP: TIdPOP3; User, Pass, Host: string; Port: Integer):String;
В коде ищем строчки вывода количества сообщений:

// Возвращаем результат
  Result:='Подключение прошло успешно!'+#13#10;
  Result:=Result+'У вас '+IntToStr(NumOfMsgs)+' сообщений';
  //Сюда добавим код провекрки вложенных файлов и сохранение на диск
end
except // Если произошла ошибка- возвращаем текст ошибки
  on E:Exception do Result:='Ошибка подключения! '+E.Message;
end;

И дописываем код который будет получать информацию о сообщении и сохранять вложенный файлы в папку.

...
Result := Result+'У вас '+IntToStr(NumOfMsgs)+' сообщений';
//Цикл по всем письмам
for I := 1 to NumOfMsgs do
begin
  if not IP.Retrieve(I, IdMessage1) then
  begin
    //записать в гол что не удалось получить сообщение с ID = I
    Exit;
  end;
//сохранение результатов в лог по каждому письму отдельно
SaveToLog(IdMessage1);
for J := 0 to IdMessage1.MessageParts.Count - 1 do
  if IdMessage1.MessageParts[J].PartType = mptAttachment then
  begin
    //Создаем папку формат .\Attach\2013.04.09\UID сообщения
    AttachPath := IncludeTrailingPathDelimiter(ExtractFilePath(ParamStr(0))+'Attach\'+FormatDateTime('yyyy.mm.dd', IdMessage1.Date)+'\'+IdMessage1.UID);
    ForceDirectories(AttachPath);
    //Сохранение файла
    (IdMessage1.MessageParts[J] as TidAttachmentFile).SaveToFile(AttachPath + IdMessage1.MessageParts[J].FileName);
  end;
end;
...

Для того чтобы все это заработало обязательно нужно в раздел uses добавить модули:

uses
   ... idMessageParts, IdAttachmentFile

PS: Исходники программы можно скачать на GitHub

Delphi — проверка почты (Часть 3): 1 комментарий

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *