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

Про работу с SMTP в Synapse поговорили, а про POP3 я как-то умолчал. Получается письмо отправить смогли, а ответ получить – уже нет :). Что ж, ликвидируем это досадное упущение и рассмотрим основы работы с классом TPOP3Send.

Этот класс удобно использовать для получение писем с почтовых серверов, поддерживающих работу с POP3. Сразу следует отметить, что TPOP3Send – наследник класса TSynaClient, поэтому не удивляйтесь, что в его свойствах в явном виде отсутствуют свойства для хранения логина, пароля и хоста.

Сама работа с классом, как и со все библиотекой в целом, достаточно прозрачна и понятна. Сегодня рассмотрим работу с TPOP3Send на примере получения писем с mail.ru, т.е. без использования SSL.

1. Авторизация.

Прежде, чем начинать работу с почтовым сервером, нам необходимо авторизоваться. При этом, по умолчанию TPOP3Send использует 110 порт и прописывать его вручную нужды нет. Теперь создадим небольшое тестовой приложение в Delphi или Lazarus – без разницы. У меня главная форма получилась вот такой:

pop3_1

В Memo1 будем выводить все ответы сервера.

Обработчик onClick кнопки создадим таким:

procedure TForm1.Button1Click(Sender: TObject);
begin
  POP:=TPOP3Send.Create;
  POP.AuthType:=POP3AuthLogin;
  POP.Password:=PassEdit.Text;
  POP.UserName:=LoginEdit.Text;
  POP.TargetHost:=HostEdit.Text;
  if POP.Login then
    begin
      if POP.Stat then
        begin
          Label5.Caption:=IntToStr(POP.StatCount);
          Label7.Caption:=IntToStr(POP.StatSize);
        end;
    end
  else
    Memo1.Lines.Add('Ошибка авторизации');
end;

Рассмотрим свойства и методы, которые мы использовали.

Свойство AuthType указывает тип авторизации. Может принимать одно из трех значений:

  • POP3AuthAll – используется по умолчанию при создании объекта. При этом авторизация проходит вначале с использованием команды APOP и, если авторизация не прошла, то используется самый распространенный способ авторизации с использованием команд USER и PASS.
  • POP3AuthLogin – авторизация с использованием команд USER и PASS
  • POP3AuthAPOP – авторизация с использованием команды APOP.

Метод Login – авторизация на сервере с использованием команд, определяемых свойством AuthType. Если авторизация прошла успешно, то метод возвращает True.

Метод Stat отправляет на сервер команду STAT в результате чего сервер возвращает общее количество писем в почтовом ящике (свойство StatCount) и их общий размер в символах (свойство StatSize).

2. Запрос возможностей сервера.

После того как мы авторизовались на сервере мы можем узнать какие возможности поддерживаются сервером. Для этого необходимо воспользоваться методом Capability. Допишем onClick следующим образом:

if POP.Login then
  begin
   if POP.Stat then
     begin
       ....
     end;
   if POP.Capability then
     Memo1.Lines.Assign(POP.FullResult);
    end

Здесь мы воспользовались ещё одним свойством — FullResult, которое возвращает весь ответ сервера в виде списка TStringList. Метод Capability отправляет на сервер команду CAPA и, в случае если сервер поддерживает использование этой команды, нам возвращается список дополнительных команд, поддерживаемых сервером. Вот, например, что вернул mail.ru:

  • STLS – поддерживает защищенную передачу данных. Команда STLS принимается сервером только после авторизации.
  • TOP — Если ответ сервера положительный, то после него он передаёт заголовки сообщения и указанное кол — во строк из тела сообщения.
  • USER – поддержка команды USER. То есть по этой возможности можно судить о том, что на сервере можно авторизоваться обычным образом – передачей пары команд USER – PASS.
  • LOGIN-DELAY 120 – минимальный интервал (в секундах) между повторными аутентификациями.
  • PIPELINING – указывает на то, что сервер может принимать сразу несколько команд от пользователя.
  • EXPIRE NEVER – гарантированный минимум (в днях) сохранения аутентификации пользователя. В нашем случае параметр равен NEVER, т.е. mail.ru сохраняет аутентификацию постоянно до момента выхода (Logout)
  • UIDL – сервер поддерживает использование команды UIDL в результате которой мы модем получить уникальные идентификаторы для любого письма.
  • IMPLEMENTATION Mail.Ru – строка, содержащая информацию о сервере.

3. Получение информации по каждому сообщению.

Перед тем как закачивать какое-либо сообщение желательно оценить его размеры. Для этого можно воспользоваться методом List. В качестве параметра List принимает номер сообщения по которому необходимо передать информацию. Если параметр равен нулю, то возвращается информация по всем сообщениям.

Добавьте на форму ещё одну кнопку и напишите для неё следующий обработчик:

procedure TForm1.Button2Click(Sender: TObject);
begin
  if POP.List(0) then
    Memo1.Lines.Assign(POP.FullResult);
end;

Как видите мы снова воспользовались свойством FullResult для получения информации по ответу. В результате каждая строка содержит номер сообщения в ящике, пробел и размер сообщения в символах.

На этом подготовительные работы можно считать завершенными. Следующий шаг – скачивание писем, использование дополнительных команд и т.д. Но это в следующий раз :)

Книжная полка

Описание: Рассмотрены практические вопросы по разработке клиент-серверных приложений в среде Delphi 7 и Delphi 2005 с использованием СУБД MS SQL Server 2000, InterBase и Firebird. Приведена информация о теории построения реляционных баз данных и языке SQL. Освещены вопросы эксплуатации и администрирования СУБД.
купить книгу delphi на ЛитРес
Описание: Рассмотрены малоосвещенные вопросы программирования в Delphi. Описаны методы интеграции VCL и API. Показаны внутренние механизмы VCL и приведены примеры вмешательства в эти механизмы. Рассмотрено использование сокетов в Delphi: различные режимы их работы, особенности для протоколов TCP и UDP и др.
купить книгу delphi на ЛитРес
0 0 голоса
Рейтинг статьи
уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.
Подписаться
Уведомить о
33 Комментарий
Межтекстовые Отзывы
Посмотреть все комментарии
Илья
Илья
31/10/2010 22:41

Я сильно извиняюсь, но не знаю даже куда обратиться.
Короче говоря, есть сайт, на котором посредством ГЭТ_ПОСТ происходит передача определенного, введеного номера, после чего сайт выдает определенную информацию.Вот как это выглядит:
<a href=’http://saveimg.ru’> <img src=’http://saveimg.ru/pictures/31-10-10/c4a3184668f86ecf65bac4df88e62fde.png’ alt=’б’> </a>
при вводе номера 666, в лайв-http выдает

Cache-Control: no-cache
rbPosm=3&rbInOut=1&result=666

Итак что мне нужно. Мне нужно передать номер и нажать соотв. кнопку «Найти» в дельфи, после чего получить страницу с информацией. Проблема состоит в том, КАК передать необходимую информацию сайту?…
Ни на одном форуме помощи не получил…

Илья
Илья
01/11/2010 15:25

HTTP.MimeType:=’application/x-www-form-urlencoded’;
HTTP:=THTTPSend.Create;
HTTP.MimeType:=’application/x-www-form-urlencoded’;
if HTTP.HTTPMethod(‘BarCode=1′,’ссылка на страницу’) then
memo1.text:=  HTTP.ResultString;
 
Выдает соответственно Bad Request.Что делать, незнаю…

Илья
Илья
01/11/2010 21:30

Ну видишь, я ничего не знаю.
Вот скрин лайва — http://saveimg.ru/show-image.php?id=b06f4976c980b968cd93ecf26a68f640
Нужно послать ссылку вида
http://balblabla/?q={searchTerms}&amp;s=o, где searchterms-нужное значение, после чего получить ответ.

Получить страницу выше не проблема, но нужно еще нажать кнопку, и убрать личшнее, но это уже другая история)
В теме что Вы советовали такого не нашел. Хотя я не понимаю ничего в сетевом программировании, может что и есть там.
 

Илья
Илья
02/11/2010 21:43

Ладно.Последний вопрос и отстану от Вас.Это означает что пост запрос успешно выполнен?

HTTP/1.1 302 Found
Connection: close
Content-Length: 0
Date: Tue, 02 Nov 2010 16:00:07 GMT
Location: /info/ems-search-packages-mail/
Content-Type: text/html
Server: Apache/2.0.61 (FreeBSD) PHP/5.2.5
X-Powered-By: PHP/5.2.5
Keep-Alive: timeout=15, max=100

Leser
Leser
06/11/2010 18:48

А подскажите, как залогинться к gmail?
Указаный пример не проходит, я так понимаю это связано с тем, что на сервер входящей почты требуется SSL?

Евгений
Евгений
01/03/2011 17:01

что то у меня не получается подключится, сразу выдает ошибка авторизации((((
 
procedure TfrmMain.Button1Click(Sender: TObject);
var
POP3:TPOP3Send;
begin
LoadOption;
POP3:=TPOP3Send.Create;
POP3.AuthType:=POP3AuthAPOP;
POP3.Password:=UserName;
POP3.UserName:=Password;
POP3.TargetHost:=POP3Server;
if POP3.Login then
begin
if POP3.Stat then
begin
LogScreen.Lines.Add(IntToStr(POP3.StatCount));
LogScreen.Lines.Add(IntToStr(POP3.StatSize));
end;
end
else
LogScreen.Lines.Add(‘Ошибка авторизации’);
POP3.Free;
end;

Александр
01/05/2012 13:38

Здравствуйте!
Почему-то Ваш способ получения почты не хочет работать ящиками rambler.ru.
Смотрел настройки для внешних клиентов. Они такие же, как на mail.ru. Разве, что сервер входящей\исходящей почты одинаков: mail.rambler.ru.
Пробовал даже подключать модуль: ssl_openssl и экспериментировать с настройками: StartTLS; AutoTLS; FullSSL. Ничего не помогает. :(

Пожалуйста, помогите разобраться.

Александр
01/05/2012 14:47

Уважаемый Vlad
Можете посмотреть, а то застопорился на подключении и дальше никуда.
Могу дать тестовый ящик:
artm-artmenko@rambler.ru
Login: artm-artmenko
Pass: 123456www
POP3: mail.rambler.ru

Описание настроек: help.rambler.ru/1/mail/mail-pochtovye-klienty/1275/

Александр
01/05/2012 14:51

И ещё давно интересует такой вопрос: как можно зарегистрироваться на Вашем замечательном сайте? А то уже давно здесь обитаю, а комментарии приходится писать, как Гость!

Александр
02/05/2012 13:01

Vlad,
Спасибо, что уделили мне время. На самом деле — это я протупил. Забыл пароль на рамблеровский ящик. :)

VorVV
03/09/2012 21:54

[code]Synapse. TPOP3Send. Подготовительные работы.
Следующий шаг – скачивание писем, использование дополнительных команд и т.д. Но это в следующий раз :)
Когда выйдет эта тема?[/code]

VorVV
03/09/2012 21:56

[code]Следующий шаг – скачивание писем, использование дополнительных команд и т.д. Но это в следующий раз :)

Особенно интересует: Проверка прочитано письмо или нет[/code]

trackback
Synapse: работа с вложениями в письмах. | Delphi в Internet
30/11/2012 05:57

[…] на предыдущие посты по работе с TPOP3Send, их всего два: "Synapse. TPOP3Send. Подготовительные работы" и "Synapse TPOP3Send. Обработка […]

Sujimoshi
Sujimoshi
27/03/2013 14:19

Извиняюсь. У меня такая беда. Нужно к авторизации POP3 прикрутить прокси! Прочитал темы о прокси в синапсе прописал socks(для использования прокси). Но я не вижу что он работает! Подскажите предусмотрено ли взамодействие поп3 и прокси в синапс. И если да то как?(тем методом что вы описали в своих темах про прокси или другими способами. Спасибо

Daner
Daner
22/04/2013 12:12

Здравствуйте, у меня проблема при объявлении переменной POP «var POP:TPOP3Send;» пишет [Error] Unit1.pas(36): Undeclared identifier: ‘TPOP3Send’. Не подскажите что делать? заранее спасибо

os
os
26/07/2013 00:10

Здравствуйте, почему то не получается войти в почту mail и яндекс по вышеприведенному коду
для входа в test@mail.ru использ : host mail.ru, login test,pass 111, для test@yandex.ru
host mail.yandex.ru, login test. В чем же дело не подскажите?

Виктор
Виктор
06/01/2014 17:58
Ответить на  os

Не подключается так как Google и Яндекс, так же как Рамблер и многие другие используют SSL, для подключения надо использовать следующие библиотеки:
libeay32.dll
ssleay32.dll

Так же использовать 995 порт, а не 110, и не забыть про POP.FullSSL:=true;

Удачи

Nikolay
Nikolay
05/08/2013 04:16

if Pop3.Login then good else bad !
Это я понял, а что делать например если ошибка, не бед и не гуд, а просто не прошел запрос?
Просто я еще прокси использую для pop и imap

Nikolay
Nikolay
05/08/2013 14:40
Ответить на  Vlad

Я имел ввиду как обрабатывать ошибки?
На пример как в http
IF HTTP.HTTPMethod(‘GET’, ‘****’) then begin
тут выполняем свои действия end else ERROR!
Вот тут если не прошел значит Error (я просто новичок, может чего не допонимаю? )
Может загружать ответ сервера и по нему определять?

Виктор
Виктор
05/01/2014 20:54

Вопрос, подключаюсь к GMAIL получаю кол-во писем и это значение магически неверное, 375 штук хотя в ящике более 600 писем,то же самое значение получал и при использовании INDY IDPop3.CheckMessages. Думал вопрос в настройках ящика отключил POP и включил для всех писем, и тоже самое, проверил на другом ящике где висит более 3000 писем значение выдало 474 письма.

Очень нужна Ваша помощь, вот код на Synapse

POP3:=TPOP3Send.Create;
POP3.AuthType:=POP3AuthLogin;
POP3.Password:=’********’;
POP3.UserName:=’test@gmail.com’;
POP3.TargetHost:=’pop.gmail.com’;
POP3.TargetPort:=’995′;
POP3.FullSSL:=true;
if POP3.Login then
if POP3.Stat then
ShowMessage(IntToStr(POP3.StatCount))
else
ShowMessage(‘Error’);

POP3.Logout;