ВСЕ ЗАПИСИ

Статьи,заметки

POP3 клиент на Delphi (SSL, Indy 9)

Скажу сразу, что при создании клиента для приёма почты, использовать Delphi 7 смысла нет, для данной задачи нужно брать современную среду разработки, пример описанный в этой статье, был разработан в RAD Studio XE5 (также был проверен в последней на текущий момент XE8, - компиллируется без каких-либо исправлений в коде). При использовании RAD Studio нет необходимости заботиться о кодировке письма, нет проблем с сохранением вложений с кириллическими именами, в RAD Studio это реализовано по умолчанию, в отличие от Delphi 7, где для декодирования темы, или тела письма бывает нужно ещё применять дополнительные функции.

Для изучения методов получения email по протоколу POP3 я написал тестовое приложение, ссылка на исходник - внизу, в архив вложены необходимые библиотеки для SSL аутентификации.

Программа умеет сохранять вложения, вложенные файлы и исходники писем в формате eml складываются в индивидуальные поддиректории. Письмо также можно экспортировать в html файл с картинками. Особое внимание было уделено тому, чтобы содержание письма отображалось максимально корректно, так, как оно выводится например, в веб интерфейсе почтовых служб и стандартных почтовых клиентах типа Outlook Express. То есть, чтобы не терялось оригинальное форматирование письма, все смайлики и другие встроенные изображения были на местеsmile Для этого использован стандартный TWebBrowser, куда выводится содержание письма.

Следует заметить, что с картинками, встроенными в тело письма, не всё так просто, в большинстве случаев их можно легко сохранить на диск, прочитав свойства IdMessage1.MessageParts .Items[порядковый номер] .ContentID и IdMessage1.MessageParts .Items[порядковый номер] .FileName, (перед выводом письма в браузер, заменяем ссылки на локальные, куда сохранены картинки) но вот на gmail, ContentID и FileName имеют разные значения и поэтому ссылка на сохранённую картинку и имя файла не совпадают, в моём исходнике эта проблема решена. Rambler и Mail Ru, смайлы в тело письма не встраивают, вместо этого вставляют ссылки на изображения, которые расположены у них на сервере.

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

В примере использованы компоненты Indy 9 установленные по умолчанию в XE5, в папке с проектом также находятся дополнительные модули: md5hash.pas и HtmlHeader.pas, первый используется при генерации уникального имени для сохраняемых сообщений, второй я применил для формирования html кода, который отображает заголовки письма(дату, адрес и пр.) для встраивания в страницу, при экспорте EML в HTML, непосредственно для приёма почты эти файлы не нужны.

При создании проекта бросаем на форму компоненты TIdPOP3, TIdMessage, TIdSSLIOHandlerSocketOpenSSL. Также вручную прописываем в uses модули, которых нет на панели компонентов: IdText, IdAttachment, которые необходимы для обработки вложений. Для отображения писем в браузере добавляем на форму сам WebBrowser и модуль MSHTML в uses. Свойства IdPOP3, IdMessage, IdSSLIOHandlerSocket в Object Inspector не трогаем, оставляем всё по умолчанию.

Код соединения с сервером и получение email:

IdPOP31.Host:='pop.mail.ru';
IdPOP31.Port:=995;
IdPOP31.Username:='login@mail.ru';
IdPOP31.Password:='password';
IdPOP31.IOHandler:= TIdSSLIOHandlerSocketOpenSSL .Create(IdPOP31);
IdPOP31.UseTLS:=utUseImplicitTLS;
IdSSLIOHandlerSocketOpenSSL1 .SSLOptions.Method:=sslvTLSv1;
//IdPOP31.ConnectTimeout:=2000;//таймаут подключения(необязательно)
IdPOP31.Connect;
i:=IdPOP31.CheckMessages();//узнаём кол-во писем в ящике
IdPOP31.Retrieve(i,IdMessage1);//грузим письмо с максимальным номером(самое новое)
//в моём примере переменная i задаётся в поле ввода на форме, чтобы вручную выбрать любое письмо
IdMessage1.SaveToFile('заданный путь/message.eml')//сохраняем сообщение в файл

Обработка письма

Прежде всего требуется определить, является ли сообщение обычным сообщением в текстовом или html формате, либо это сообщение, состоящее из нескольких частей в котором кроме текста, могут содержаться и другие файлы:

messtext1:=IdMessage1.Body.Text;
if (messtext1='') or (AnsiPos('multi-part message in MIME format',messtext1)>0) then
messtext1:='';//если в письме нет никакого текста, либо содержится строка This is a multi-part message in MIME format
//(это признак составного письма - значит текст может быть в другом месте)
значит это просто пустое письмо, прекращаем поиск текста здесь, или можем получить ошибку в программе

//иначе идём дальше, здесь проверяем является ли сообщение обычным сообщением в текстовом или html формате
if (IdMessage1.ContentType='text/html') or (IdMessage1.ContentType='text/plain') then
begin

//если проверка показала, что это обычное письмо, показываем его в браузере и прекращаем дальнейшую обработку
AppendToWB(WebBrowser1, messtext1);//здесь выводим текст сообщения в браузер, о процедуре AppendToWB() расскажу ниже
//Memo1.Text:=messtext1;//записываем раскодированный текст письма в Memo
exit;
end;

Если проверка показала, что это multi-part message, в цикле извлекаем из сообщения части, содержащие текст и вложения:

for n:=0 to IdMessage1.MessageParts.Count-1 do
begin
ttype:=idMessage1.MessageParts[n] .ClassName;
if (ttype='TIdText') and not (ttype=NULL) then
messtext2:=TIdText(idMessage1 .MessageParts .Items[n]).Body.Text;//извлекаем текстовую часть письма

Находим и сохраняем вложения:

atype:=idMessage1.MessageParts[n] .ClassName;
if atype='TIdAttachmentFile' then
begin
aname:=IdMessage1.MessageParts. Items[n] .FileName;
if aname='' then
aname:='unknown_file';
attach:=TIdAttachment(IdMessage1 .MessageParts .Items[n]);
attach.SaveToFile('заданный путь'+'\'+aname);//сохраняем вложенный файл
Memo2.Lines.Add(aname);//выводим имя вложенного файла в Memo
end;
attach.Free;
if IdPOP31.Connected = True then
IdPOP31.Disconnect;//закрываем соединение
AppendToWB(WebBrowser1,messtext2); //выводим текст письма в браузер
end;

Код процедуры отображения текста письма в браузере:

procedure TForm1.AppendToWB(WB:TWebBrowser; const html:widestring);//This procedure displays message text in TWebBrowser
var
Range:IHTMLTxtRange;
begin
Range:=((WB.Document AS IHTMLDocument2).body AS IHTMLBodyElement).createTextRange;
Range.Collapse(False);
Range.PasteHTML(html);
end;

Полный листинг кода: Показать

Это минимальный рабочий код, здесь нет вывода заголовков письма: "тема", "адрес отправителя" и пр., также не показано, как преобразовывать ссылки на встроенные изображения в письме, чтобы они отображались в браузере (это можно сделать например, обработкой кода письма в Memo, перед выводом в браузер).

Всё это реализовано в приложении скачать исходник код подробно прокомментирован на английском. Из нереализованного: надо бы исправить некорректное сохранение письма в формате html для китайского и ему подобных языков, - иероглифы заменяются на знаки вопроса, при этом в браузере китайский отображается нормально.

Если есть вопросы или предложения по теме, - заходите в комменты

Добавлено: май 2015

©Veterock




комментарии (66)



написал EdwardLem
Спасибо за пост
добавлено: 19.01.21 20:23
написал Donaldmaync
не работает
добавлено: 15.01.21 01:22
написал masha.tikhonofaKn61
Revolutional update of captcha regignizing software "XEvil 5.0": Captchas solving of Google (ReCaptcha-2 and ReCaptcha-3), Facebook, BitFinex, Microsoft, Mail.Ru, SolveMedia, Steam, and more than 12000 another types of captchas, with highest precision (80..100%) and highest speed (100 img per second). You can use XEvil 5.0 with any most popular SEO/SMM programms: iMacros, XRumer, SERP Parser, GSA SER, RankerX, ZennoPoster, Scrapebox, Senuke, FaucetCollector and more than 100 of other programms. Interested? There are a lot of impessive videos about XEvil in YouTube. FREE DEMO AVAILABLE! Good luck wink P.S. A Huge Discount -30% for XEvil full version until 15 Jan is AVAILABLE! smile XEvil Net
добавлено: 31.12.20 06:49
написал IkserKr
Здравствуйте! У вас отличный сайт, но я удивлен тем, что у него такие низкие показатели в поисковых системах. Почему? Да, скорее всего, из-за недоверия самих поисковиков к вашему ресурсу. А это значит, что на него очень мало ссылаются других сайтов. То есть, мало ссылок на ваш сайт. Я хочу вам предложить исправить данную ситуацию и проделать работу по наращиванию ссылочной массы на ваш ресурс. Вы получите более 1000 ссылок–доноров на ваш сайт. Эти ссылки будут анкорными и безанкорными, под ваши ключевые фразы, по которым продвигаете свой сайт. А это даст рост позиций, траст, доверие поисковиков, хорошую и быструю индексацию, посещаемость, плюс ИКС! Работа займет примерно 1-2 недели, после которой вы получите долгожданный эффект, которого скорее всего еще ваш сайт не видел. Имеется в виду положительный результат, которому вы будете приятно удивлены. Я работаю на качество, как для себя и очень дорожу своими постоянными клиентами. От вас мне необходима лишь ссылка на ваш сайт и ключевые слова. Стоимость моей услуги составляет всего лишь 9900 рублей, но я готов вам сделать небольшую скидку, чтобы мы с вами подружились и вы заказывали бы продвижение сайта лишь у меня, так как я знаю в этом толк и у меня есть большой опыт. Если вам интересно мое предложение, то пожалуйста свяжитесь со мной по E-mail: proxrum@mail.ru С Уважением к вам, Вадим.
добавлено: 22.12.20 04:43
написал Diiiglaslit
C*P PT*HC Lolita Girls Fu*ck Whip-round Pt!!hc c!!p offline forum xtl.jp/?At
добавлено: 16.12.20 07:51
написал Stephenmyday
Профессиональная Реклама Серых тем, Казино онлайн, Casino online, Gaming Звоните: Telegram @evg7773
добавлено: 15.12.20 13:41
написал Matthewmut
<b></b>
добавлено: 09.12.20 18:25
написал novostroyka63log
<b></b>
добавлено: 08.12.20 11:22
написал aperca.se
It is the best time to make some plans for the future and it is time to be happy. I have read this post and if I could I desire to suggest you some interesting things or tips. Perhaps you could write next articles referring to this article. I wish to read more things about it! suspi.aperca.se/map3.php vad är giftigt för katter
добавлено: 06.11.20 11:04
написал munhea.se
Way cool! Some extremely valid points! I appreciate you penning this article plus the rest of the site is really good. enza.munhea.se/map3.php exit games stockholm
добавлено: 05.11.20 21:04
написал aperca.se
This is my first time visit at here and i am really pleassant to read everthing at single place. nerga.aperca.se/map1.php eternity parfym herr
добавлено: 05.11.20 16:33
написал azilopar.se sГ¤tt att gГҐ ner i vikt
Pretty section of content. I just stumbled upon your site and in accession capital to assert that I get actually enjoyed account your blog posts. Any way I'll be subscribing to your augment and even I achievement you access consistently rapidly. sätt att gå ner i vikt azilopar.se/map12.php
добавлено: 05.11.20 08:48
написал munhea.se
Howdy! I could have sworn I've been to this blog before but after looking at some of the posts I realized it's new to me. Anyhow, I'm definitely pleased I found it and I'll be book-marking it and checking back frequently! gurgle.munhea.se/map6.php elizabeth arden parfume
добавлено: 04.11.20 01:01
написал aperca.se
Attractive section of content. I just stumbled upon your web site and in accession capital to say that I acquire in fact loved account your weblog posts. Anyway I will be subscribing for your feeds and even I success you get admission to consistently quickly. inun.aperca.se/map10.php fetaost soltorkade tomater röra
добавлено: 03.11.20 23:34
написал lanba.se
This design is wicked! You obviously know how to keep a reader amused. Between your wit and your videos, I was almost moved to start my own blog (well, almost...HaHa!) Excellent job. I really loved what you had to say, and more than that, how you presented it. Too cool! lanba.se/map4.php hepatit b vaccin kostnad
добавлено: 03.11.20 12:55
написал munhea.se
Greetings! I've been reading your weblog for a while now and finally got the courage to go ahead and give you a shout out from Dallas Tx! Just wanted to say keep up the excellent work! mondd.munhea.se/map6.php bygg din vw
добавлено: 02.11.20 12:01
написал aperca.se
Have you ever considered about adding a little bit more than just your articles? I mean, what you say is important and everything. But think about if you added some great graphics or videos to give your posts more, "pop"! Your content is excellent but with pics and clips, this website could certainly be one of the greatest in its niche. Good blog! reldo.aperca.se/map8.php pannkakor för 2 personer
добавлено: 02.11.20 05:47
написал munhea.se
Thanks for any other informative blog. Where else may I am getting that type of information written in such a perfect manner? I have a venture that I'm simply now working on, and I've been on the glance out for such info. ketsl.munhea.se/map3.php chokladfyllning till tГҐrta
добавлено: 31.10.20 23:44
написал munhea.se
This is my first time visit at here and i am truly happy to read all at one place. minsk.munhea.se/map5.php jag gГҐr upp i vikt
добавлено: 28.10.20 22:12
написал aperca.se
Hey very cool web site!! Guy .. Excellent .. Superb .. I will bookmark your blog and take the feeds also? I am happy to search out so many useful information right here within the publish, we'd like work out extra techniques on this regard, thanks for sharing. . . . . . suspi.aperca.se/map5.php soppa med pasta
добавлено: 27.10.20 10:58
написал munhea.se
I visit everyday a few web pages and information sites to read articles, however this webpage presents quality based articles. munhea.se/map2.php björn axen mjällschampo
добавлено: 27.10.20 10:11
написал munhea.se
Hi there to all, the contents existing at this website are truly amazing for people experience, well, keep up the nice work fellows. arsor.munhea.se/map3.php isolera befintlig innervägg
добавлено: 26.10.20 22:52
написал aperca.se
Hi there, just wanted to tell you, I loved this post. It was inspiring. Keep on posting! tortm.aperca.se/map7.php fogsand xl bygg
добавлено: 25.10.20 15:23
написал munhea.se
Write more, thats all I have to say. Literally, it seems as though you relied on the video to make your point. You definitely know what youre talking about, why waste your intelligence on just posting videos to your weblog when you could be giving us something informative to read? masco.munhea.se/map3.php accelerator tanning lotion
добавлено: 25.10.20 11:52
написал aperca.se
For most up-to-date information you have to go to see world wide web and on internet I found this website as a best website for hottest updates. emti.aperca.se/map13.php pycnogenol for varicose veins
добавлено: 24.10.20 22:23
написал persdap.se
Excellent blog here! Also your site loads up fast! What host are you using? Can I get your affiliate link to your host? I wish my web site loaded up as quickly as yours lol persdap.se/map6.php svala byxor herr
добавлено: 24.10.20 18:16
написал aperca.se
Hey would you mind stating which blog platform you're working with? I'm planning to start my own blog soon but I'm having a tough time selecting between BlogEngine/Wordpress/B2evolution and Drupal. The reason I ask is because your design and style seems different then most blogs and I'm looking for something unique. P.S Sorry for being off-topic but I had to ask! kinsl.aperca.se/map3.php rolig sallad till maten
добавлено: 24.10.20 09:20
написал aperca.se
Do you have a spam issue on this site; I also am a blogger, and I was wondering your situation; we have developed some nice procedures and we are looking to trade solutions with others, please shoot me an email if interested. chrys.aperca.se/map10.php renons mygg och fästing
добавлено: 23.10.20 20:49
написал munhea.se
What's up, I check your new stuff on a regular basis. Your humoristic style is awesome, keep up the good work! cents.munhea.se/map4.php eos läppbalsam innehåll
добавлено: 23.10.20 14:10
написал aperca.se
Hi, its fastidious piece of writing regarding media print, we all be familiar with media is a fantastic source of data. kinsl.aperca.se/map4.php amningsbh för storbystade
добавлено: 23.10.20 08:03
в начало  назад>> 
показаны записи 66-37
Имя

Сообщение

введите защитный код


Обновить

Powered by ©Veterock Studio 2013-2021