Задача: Расширить возможности программы проверки почты, и добавить возможность сохранять вложенные файлы в папку и логировать выполненные операции. В данной части рассмотрим следующие вопросы:
- Сохранение вложенных файлов в папку
- Логирование обработанных сообщений
Инструментарий: Delphi XE, компоненты INDY v10, Библиотеки libeay32.dll и ssleay32.dll
Решение:
Предыдущая часть:
Проверка почты средствами Delphi — часть 1
Проверка почты средствами Delphi — часть 2
Предположим что в нас есть почтовый клиент, который должен проверять почту и сохранять все вложенные файлы в некую папку.
Приступим к реализации. Для того чтобы все работало, нам понадобится еще один компонент который находится на закладке Indy Misc под названием idMessage (Рис. 1)
Напишем процедуру для логирования принятых сообщений. Для простоты я буду выводить информацию о сообщениях в 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
Ошибка подключения! Error connecting with SSL.
error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol