В прошлый раз мы рассмотрели работу с TPOP3Send и научились с помощью этого класса Synapse подключаться к серверу, оределять его возможности, а также получать количество писем в почтовом ящике и определять их размер в символах. Сегодня рассмотрим пример обработки сообщений и научимся скачивать и удалять письма с сервера.
Для получения писем у TPOP3Send определено два метода:
function Retr(Value: Integer): Boolean; function RetrStream(Value: Integer; Stream: TStream): Boolean;
Метод Retr скачивает сообщение с индексом Value вместе и сохраняет его содержимое (включая заголовки) в свойстве FullResult, а метод RetrStream в свою очередь может сохранить сообщение в моток TStream. Если Value равен нулю, то скачиваются все письма. Также следует обратить внимание на то, что если в вашем почтовом ящике находится Count писем, то, чтобы скачать последнее присланное Вам письмо необходимо задать значение Value:
Value = Count;
Используя проект, рассмотренный в этом посте, добавим на главную форму приложения ещё одну кнопку и напишем у неё следующий обработчик:
... POP.Retr(1); Memo1.Lines.Assign(POP.FullResult)
Теперь запустим приложение и посмотрим, что получилось:
Как видите, снова “проблема” с кодировками. Более того, FullResult содержит все заголовки письма, которые, в большинстве случаев, пользователю просматривать нет необходимости. Никаких свойств и методов для декодирования сообщений TPOP3Send не содержит. Да, собственно, они у этого класса и не к чему.
Вначале научимся декодировать сообщения. Сделать это достаточно просто. Подключим в uses модули:
...mimemess, mimepart...
Модуль MimeMess.pas содержит основной класс для работы с сообщениями TMimeMess, mimepart.pas, в случае необходимости, поможет нам в работе с вложениями.
Теперь допишем обработчик кнопки следующим образом:
procedure TForm1.Button3Click(Sender: TObject); var Mess: TMimeMess; begin Memo1.Lines.Clear; POP.Retr(1);//получили самое старое письмо Mess:=TMimeMess.Create;//создали объект Mess.Lines.Assign(POP.FullResult);//записали всю полученную от сервера информацию Mess.DecodeMessage;//декодировали сообщение Memo1.Lines.Add(Mess.Header.XMailer);//вывели информацию из заголовка Memo1.Lines.Add(Mess.MessagePart.PartBody.Text);//вывели тело сообщения Mess.Free; end;
Осталось разобраться с тем как преобразовать кодировку сообщения. Информацию по кодировке текста содержится в свойстве
TMimeMess.Header.CharsetCode
Преобразование кодировок текста в Delphi я уже рассматривал, при чём несколько раз. Поэтому можете почитать, например, «3 варианта работы с кодировками веб-страниц в Delphi.«. Ну, а если Вы используете в работе Lazarus, то здесь тоже всё достаточно просто. Достаточно подключить в uses модуль LConvEncoding и преобразовывать кодировки сообщений как душа пожелает. Например, так:
KOI8ToUTF8(Mess.MessagePart.PartBody.Text)
я преобразовал текст из кодировки KOI8-R в кодировку UTF-8. В следующий раз рассмотрим работу с письмами, которые имеют вложения.
Книжная полка
Описание: Рассмотрены практические вопросы по разработке клиент-серверных приложений в среде Delphi 7 и Delphi 2005 с использованием СУБД MS SQL Server 2000, InterBase и Firebird. Приведена информация о теории построения реляционных баз данных и языке SQL. Освещены вопросы эксплуатации и администрирования СУБД.
|
||
Название: О чем не пишут в книгах по Delphi
Описание: Рассмотрены малоосвещенные вопросы программирования в Delphi. Описаны методы интеграции VCL и API. Показаны внутренние механизмы VCL и приведены примеры вмешательства в эти механизмы. Рассмотрено использование сокетов в Delphi: различные режимы их работы, особенности для протоколов TCP и UDP и др.
|
Как принимать текст понятно, не могу разобраться как правильно принимать вложения. Подскажите пожалуйста, а то найти нигде не могу по этому поводу ничего.
Плюс 1 к статье о работе со вложениями.
Andrey, Юрий. Ок, посмотрю как там что работает. Будет статья. Может не завтра, но в ближайшее время
а как-же «… и удалять письма с сервера»
Добавочка в статью:
удалить письмо с сервера — POP.Dele(1);
и не забыть (без этого не удалаяет) — POP.Logout;
У меня не выводит тело сообщения!
ос Ubuntu 13.10
ide Lazarus 1.0.10
synapse 4.0
Сообщение отправлял программой, написанной по статье http://www.webdelphi.ru/2010/02/synapse-otpravka-pisem-ispolzuya-smtp/
Так же ничего не выводит в случае если письмо отправлено с web-интерфейса почтового сервера
Сервер mail.ru
Подскажите пожалуйста как при чтении писем с помощью POP3 оставлять на сервере их непрочитанными.