уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.

В прошлый раз мы рассмотрели работу с 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)

Теперь запустим приложение и посмотрим, что получилось:

lazarus5

Как видите, снова “проблема” с кодировками. Более того, 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 и др.
купить книгу delphi на ЛитРес
0 0 голоса
Рейтинг статьи
уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.
Подписаться
Уведомить о
7 Комментарий
Межтекстовые Отзывы
Посмотреть все комментарии
Юрий
Юрий
19/11/2012 20:32

Как принимать текст понятно, не могу разобраться как правильно принимать вложения. Подскажите пожалуйста, а то найти нигде не могу по этому поводу ничего.

Andrey
Andrey
28/11/2012 18:39

Плюс 1 к статье о работе со вложениями.

Victor
Victor
28/06/2013 14:38

а как-же «… и удалять письма с сервера»

Victor
Victor
02/07/2013 13:08

Добавочка в статью:
удалить письмо с сервера — POP.Dele(1);
и не забыть (без этого не удалаяет) — POP.Logout;

Nikita
Nikita
28/11/2013 17:13

У меня не выводит тело сообщения!
ос 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

Denver Hiden
Denver Hiden
23/01/2021 17:30

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