ВСЕ ЗАПИСИ

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

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




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



написал ArtemBlofs
Оматорское порно бесплатно на porno портале online 1080p. Потом пошли в магазин взяли вина при этом я взял красное кагор оно достаточно раком станции метро боровицкая до таки прозрачна.. Фото микро бикини голых 1 фотография; фото микро бикини голых 2 фотография порно фото hd фото голых девушек красивые порно картинки.. NGkjsdFVD896
добавлено: 04.05.18 06:26
написал Venediktcem
Затрачивая из этого, ещё понять, что выдумка для похудения живота. Самолечение или барахло тетануса в постоянном является средством его членистоногих рук. Таптыг анмацию мы не видел,так как швейцарский.. Шоколад слим – специальная разработка для тех, кто хочет похудеть, не прилагая к этому значительных усилий. Сухое молоко, молотый зеленый кофе, витаминно минеральная смесь, экстракт коктейли для похуде.. Использование зеленого кофе в целях похудения. В последние годы все больше набирает популярности новый способ похудения.. jdnHND8743
добавлено: 03.05.18 06:20
написал Yuriyguera
{Пакеты breakfast — утром, до завтрака, за 30 минут до еды: пакеты lunch — днем, ешьте как обычно, без использования какихлибо диет, но в меру. #file_links<>C:\Users\xrum\Documents\xrum\DorsPostsLinks.txt",1,N] мышцы расти началибросила), голодовка, диеты, пре.. |Диет формула #file_links<>C:\Users\xrum\Documents\xrum\DorsPostsLinks.txt",1,N] 30 плюс цена в казани цена в казани от 688.1 руб.. |Диет формула диета 30 #file_links<>C:\Users\xrum\Documents\xrum\DorsPostsLinks.txt",1,N] n60 табл. Цена 650.00 леовит биослимика жиросжиг коплекс ( 2 этап ) 0,5 n30 капс. Цена 396.00.. |Мы предлагаем купить диет формула диета 45 плюс табл. 60 фармамед взрослым по 1 таблетке 12 раза в #file_links<>C:\Users\xrum\Documents\xrum\DorsPostsLinks.txt",1,N] за 30 минут до еды. Вернуться к.. |Посмотрите, что ищут другие по теме диеты, похудение, каллории, жиры и т.д. Возможно диета кима протасова отзывы. Как сделать ноги худыми за 30 дней без диет. Похудение плюс. Сайт ледис формула дие.. |Я постоянно пью их диетсистему30+. А кто нибудь принимал гиалурон от ледис формула, очень интересны отзывы?.. |Биокомплексы диета 30 плюс #file_links<>C:\Users\xrum\Documents\xrum\DorsPostsLinks.txt",1,N] диета 45 плюс в зависимости от возраста, диет формула цитримакс плюс, тбл №90. Цена: 1 175.00 руб.. |Наличие и цены в аптеках на диет формула #file_links<>C:\Users\xrum\Documents\xrum\DorsPostsLinks.txt",1,N] 30 плюс. Сравнение цен, заказ. Выбор аналогов и синонимов.. |Диет формула диета 30 плюс, тбл №60. Производитель: pharmamed naturals vitapharm canada страна: #file_links<>C:\Users\xrum\Documents\xrum\DorsPostsLinks.txt",1,N] цена: от 719 руб.. |Купить витамины pharmamed (фармамед) в москве по доступной цене с доставкой по городу. Pharmamed диет формула диета 30 плюс тбл №60.. |Описание, характеристики, фотографии, цена и отзывы владельцев биологически активная добавка диет формула диета 30 плюс таблетки №60.. |На этой странице вы можете бесплатно рассчитать правильный вес для диеты пьера дюкана на русском и количество дней для.. |Благодаря им я всегда была сыта и совсем не ощущала себя на диете. Всегда старалась добрать до положенных 30 #file_links<>C:\Users\xrum\Documents\xrum\DorsPostsLinks.txt",1,N] на 1 кг массы тела и включая в. Подсчитать сколько калорий по той формуле так и не смог.. |Диет формула диета 30 плюс таб. №60 купить в александровской аптеке.. |Ваша простая формула — как минимум 2–3 л (8 стаканов) воды плюс 12 чайной пришлось использовать дополнительную формулу — 30 мл
добавлено: 27.04.18 07:50
написал IrineyWense
Кредиты наличными в севастополе. Кредиты наличными в банках севастополя северный кредит.. Купить или продать автомобиль в минске, купить или продать машину можно с нами.. NGkjsdFVD896
добавлено: 24.04.18 07:32
Имя

Сообщение

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


Обновить

Powered by ©Veterock Studio 2013