Про работу с SMTP в Synapse поговорили, а про POP3 я как-то умолчал. Получается письмо отправить смогли, а ответ получить – уже нет :). Что ж, ликвидируем это досадное упущение и рассмотрим основы работы с классом TPOP3Send.
Этот класс удобно использовать для получение писем с почтовых серверов, поддерживающих работу с POP3. Сразу следует отметить, что TPOP3Send – наследник класса TSynaClient, поэтому не удивляйтесь, что в его свойствах в явном виде отсутствуют свойства для хранения логина, пароля и хоста.
Сама работа с классом, как и со все библиотекой в целом, достаточно прозрачна и понятна. Сегодня рассмотрим работу с TPOP3Send на примере получения писем с mail.ru, т.е. без использования SSL.
1. Авторизация.
Прежде, чем начинать работу с почтовым сервером, нам необходимо авторизоваться. При этом, по умолчанию TPOP3Send использует 110 порт и прописывать его вручную нужды нет. Теперь создадим небольшое тестовой приложение в Delphi или Lazarus – без разницы. У меня главная форма получилась вот такой:
В 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 и др.
|
Я сильно извиняюсь, но не знаю даже куда обратиться.
Короче говоря, есть сайт, на котором посредством ГЭТ_ПОСТ происходит передача определенного, введеного номера, после чего сайт выдает определенную информацию.Вот как это выглядит:
<a href=’http://saveimg.ru’> <img src=’http://saveimg.ru/pictures/31-10-10/c4a3184668f86ecf65bac4df88e62fde.png’ alt=’б’> </a>
при вводе номера 666, в лайв-http выдает
Итак что мне нужно. Мне нужно передать номер и нажать соотв. кнопку «Найти» в дельфи, после чего получить страницу с информацией. Проблема состоит в том, КАК передать необходимую информацию сайту?…
Ни на одном форуме помощи не получил…
Зачем вам кнопка, если вы итак знаете, что при отправке выполняется POST и какие данные при этом передаются? По-моему ковыряние в DOV в этом случае — бесполезная трата времени. Берете любую библиотеку для работы с HTTP-протоколом (Indy, Synapse, ICS, WinInet и т.д.), отправляете POST-запрос на сервер, тот в свою очередь вернет Вам результат запроса, что-это я не знаю (по картинке не видно), обычно возвращается как раз-таки страница, содержащая HTML-код. Ну, а как юзать тот же Synapse так этой инфы даже в этом блоге валом, не говоря уже про форумы и другие сайты типа Королевства.
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.Что делать, незнаю…
Ну, во-первых, программа должна выкидывать ошибку сама по себе. Кто ж присваивает значение свойству несуществующего объекта? Это я про первую строку. Во-вторых, на кой вам дважды указывать MimeType? Synapse прекрасно всё понимает с первого раза. В-третьих, есть методы GET, POST, HEAD, PUT. Откуда взялся метод BarCode=1?? Вы ж, блин, почитайте хотя б про то с чем имеете дело — это я про HTTP-протокол. А потом про работу с Synapse. Пример отправки POST-запроса есть тут.
Ну видишь, я ничего не знаю.
Вот скрин лайва — http://saveimg.ru/show-image.php?id=b06f4976c980b968cd93ecf26a68f640
Нужно послать ссылку вида
http://balblabla/?q={searchTerms}&s=o, где searchterms-нужное значение, после чего получить ответ.
Получить страницу выше не проблема, но нужно еще нажать кнопку, и убрать личшнее, но это уже другая история)
В теме что Вы советовали такого не нашел. Хотя я не понимаю ничего в сетевом программировании, может что и есть там.
Ну так я-то здесь при чем? Мне надо написать вам программу что ли? Так это за отдельную плату
Ладно.Последний вопрос и отстану от Вас.Это означает что пост запрос успешно выполнен?
Это означает, что вас перенаправили на /info/ems-search-packages-mail/ и по этому адресу есть что-то. Что — перейдите и проверьте
А подскажите, как залогинться к gmail?
Указаный пример не проходит, я так понимаю это связано с тем, что на сервер входящей почты требуется SSL?
Именно так. GMail использует TSL, поэтому пример для логина в mail.ru не подходит
что то у меня не получается подключится, сразу выдает ошибка авторизации((((
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;
Здравствуйте!
Почему-то Ваш способ получения почты не хочет работать ящиками rambler.ru.
Смотрел настройки для внешних клиентов. Они такие же, как на mail.ru. Разве, что сервер входящей\исходящей почты одинаков: mail.rambler.ru.
Пробовал даже подключать модуль: ssl_openssl и экспериментировать с настройками: StartTLS; AutoTLS; FullSSL. Ничего не помогает. :(
Пожалуйста, помогите разобраться.
Приветствую, Александр. Я с этой почтой вообще мало работал, поэтому сейчас сказать не могу в чем там может быть проблема. Надо посмотреть..
Уважаемый Vlad
Можете посмотреть, а то застопорился на подключении и дальше никуда.
Могу дать тестовый ящик:
artm-artmenko@rambler.ru
Login: artm-artmenko
Pass: 123456www
POP3: mail.rambler.ru
Описание настроек: help.rambler.ru/1/mail/mail-pochtovye-klienty/1275/
Александр, с тем логином и паролем, что вы дали даже через веб-интерфейс залогиниться не получается — говорит неверный логин или пароль. Ладно, сейчас попробую свой ящик зарегать.
Александр, я зарегистрировал новый ящик на рамблере. Выполнил код 1 в 1 как в посте и все сработало — логин прошел, количество писем получилось без проблем…На всякий случай: логин указывается без @rambler.ru, номер порта — менять не надо, если используется pop3, если хотите работать через IMAP — тогда надо. Попробуйте повторить ещё раз то, что в посте написано. Если не заработает — тогда скидывайте мне на мыло свой исходник и, желательно, доступ к тестовому ящику, чтобы я хотя бы увидел причину почему у вас авторизация не проходит.
И ещё давно интересует такой вопрос: как можно зарегистрироваться на Вашем замечательном сайте? А то уже давно здесь обитаю, а комментарии приходится писать, как Гость!
Ок. Гляну.
На сайте можно зарегистрироваться по ссылке в футере «Войти», ну или через Форум.
Vlad,
Спасибо, что уделили мне время. На самом деле — это я протупил. Забыл пароль на рамблеровский ящик. :)
Александр, не за что :)
[code]Synapse. TPOP3Send. Подготовительные работы.
Следующий шаг – скачивание писем, использование дополнительных команд и т.д. Но это в следующий раз :)
Когда выйдет эта тема?[/code]
[code]Следующий шаг – скачивание писем, использование дополнительных команд и т.д. Но это в следующий раз :)
Особенно интересует: Проверка прочитано письмо или нет[/code]
[…] на предыдущие посты по работе с TPOP3Send, их всего два: "Synapse. TPOP3Send. Подготовительные работы" и "Synapse TPOP3Send. Обработка […]
Извиняюсь. У меня такая беда. Нужно к авторизации POP3 прикрутить прокси! Прочитал темы о прокси в синапсе прописал socks(для использования прокси). Но я не вижу что он работает! Подскажите предусмотрено ли взамодействие поп3 и прокси в синапс. И если да то как?(тем методом что вы описали в своих темах про прокси или другими способами. Спасибо
я знаю только один способ работы с прокси в синапсе — тот, что описал в статье. По идее он должен подойти и для POP3, но гарантировать не могу, т.к. сам никогда так не делал
Здравствуйте, у меня проблема при объявлении переменной POP «var POP:TPOP3Send;» пишет [Error] Unit1.pas(36): Undeclared identifier: ‘TPOP3Send’. Не подскажите что делать? заранее спасибо
Daner, в uses надо подключить модуль pop3send.pas
Здравствуйте, почему то не получается войти в почту mail и яндекс по вышеприведенному коду
для входа в test@mail.ru использ : host mail.ru, login test,pass 111, для test@yandex.ru
host mail.yandex.ru, login test. В чем же дело не подскажите?
Не подключается так как Google и Яндекс, так же как Рамблер и многие другие используют SSL, для подключения надо использовать следующие библиотеки:
libeay32.dll
ssleay32.dll
Так же использовать 995 порт, а не 110, и не забыть про POP.FullSSL:=true;
Удачи
if Pop3.Login then good else bad !
Это я понял, а что делать например если ошибка, не бед и не гуд, а просто не прошел запрос?
Просто я еще прокси использую для pop и imap
Nikolay, так, если запрос не проходит, то видимо проблемы с прокси и его надо предварительно проверять на работоспособность? Вроде бы так. И TPop3send здесь как бы и не при чём.
Я имел ввиду как обрабатывать ошибки?
На пример как в http
IF HTTP.HTTPMethod(‘GET’, ‘****’) then begin
тут выполняем свои действия end else ERROR!
Вот тут если не прошел значит Error (я просто новичок, может чего не допонимаю? )
Может загружать ответ сервера и по нему определять?
Вопрос, подключаюсь к 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;