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 комментарий

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