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

Т.к. в первом посте, касающимя работы с GMail у некоторых пользователей возникли проблемы при отправке писем, то решил сегодня чуть подробнее разобраться с тем, как работает Synapse с SSL и, возможно, помочь решить проблему с «неотправляемыми» письмами.
Заметил такую «странность» или «особенность» работы с GMail — то, что написано в этом посте, по крайней мере у меня, прекрасно работает на Windows XP, но ни в какую не работает на Windows 7. Причем в обоих ОС работа Synapse происходит абсолютно идентично — с дури по [F7] прошелся по всем модулям, касающихся работы с SSL. С чем связана эта особенность мне лично пока непонятно, но решение проблемы с отправкой писем из любой ОС все-таки нашлось. Начнем по порядку.

Организация работы Synapse с SSL

В Synapse организация работы с SSL напоминает работу любой более-менее большой программы с плагинами и происходит следующим образом.
1. Работа с Сетью ведется с использованием сокетов. Поэтому при создании таких, например, объектов как THTTPSend или TSMTPSend создается также экземпляр TTCPBlockSocket (о событиях которого я рассказывал).
2. При создании сокета происходит следующее:

constructor TTCPBlockSocket.CreateWithSSL(SSLPlugin: TSSLClass);
begin
  inherited Create;
  FSSL := SSLPlugin.Create(self);//загрузка плагина
  ...
end;

где SSLPlugin — это

  TCustomSSL = class;
  TSSLClass = class of TCustomSSL;

3. Теперь стоит вспомнить о том, то если Вы хотите работать с SSL, то должны подключить в uses модуль ssl_openssl и при этом ничего менять не надо — поддержка ssl становится доступна автоматически. Что происходит в этом модуле такого, что позволяет нам не заморачиваться над проблемой работать с https также как и с http?
А происходит следующее. В секции initialization модуля выполняется функция:

if InitSSLInterface then
    SSLImplementation := TSSLOpenSSL;

InitSSLInterface возвращает true в случае, если все необходимые для работы с SSL DLL-библиотеки загружены. В случае успеха SSLImplementation становится уже не просто TCustomSSL, а его потомком — TSSLOpenSSL в котором и реализована вся поддержка SSL включая создание self-signed сертификата на время сеанса.
Если загрузка библиотек невозможна (библиотеки отсутствуют), то в плане сбоев программы ничего не происходит — все работает, но только при попыке коннекта по https или отправке почты на gmail нам будет возвращаться код ошибки 10091 и мы всё время будем получать вместо результата — облом.

Так что первое, что нам необходимо — это скачать необходимые библиотеки, а именно:

  1. libeay32.dll
  2. ssleay32.dll

скачать их можно здесь (архив Openssl-0.9.8d-Win32). Скачиваете, укладываете в директории с программой и проблема с SSL будет решена.

Работа с GMail в Synapse.

При работе с GMail следует учитывать, что в этом случае используется шифрованное подключение TLS.  В своих статьях я обычно использовал вспомогательную функцию из модуля smtpsend — SendToRaw.  И здесь опять же для меня непонятная загадка. Дело в том, что по умолчанию при использовании этой функции поддержка TLS отключена. Для того, чтобы эта функция использовала TLS необходимо раскомментировать в ней следующую строку:

Result := False;
  ...
    SMTP.AutoTLS := True;
  ...

После этого при отправке писем указываем 587 порт и письма отправляются как надо. Проверял на Windows XP и Windows 7.

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

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

Спасибо! Теперь все работает как часы ;)

Keeper
17/07/2010 21:56

Кстати, всегда хотел узнать насчет сравнения возможностей: Indy, ICS и Synapse. Мне кажется это может стать неплохой темой для будущих статей с выводом в конце о том, что и где лучше использовать.

Keeper
17/07/2010 22:15

И еще актуальным является вопрос о кодировке заголовка сообщения и отправителя — в веб-интерфейсе (пробовал на мейл и на гмейл) все выглядит прекрасно, а вот, например Outlook видит только множество ???????????.

Deksden
Deksden
18/07/2010 00:40

Возникло такое предложение. Почему бы не сделать проект Delphi for Internet и не собрать бы в нем все компоненты для работы с различными сервисами в интернете — gmail, Twitter, contacts, …

Система может работать с несколькими транспортными уровнями — Indy, ice, synapse.

VahaC
VahaC
18/07/2010 05:18

Если вам несложно не могли бы вы выложить программу-пример, а то у меня никак не получается отправить почту с помощью synapse.

VahaC
VahaC
20/07/2010 21:13

В приведенном вами примере есть одна очень интересная особенность
если в Memo1 вписать только одну строку добавить ее к письму и отправить то получатель получит пустое письмо.
Никак не пойму почему это происходит, не могли бы прокомментировать почему так происходит?

VahaC
VahaC
21/07/2010 03:40

конечно

Евгений
Евгений
26/07/2011 15:15

Добрый день Vlad. Заметил странную особенность. Мне каждый день нужно отправлять автоматически один отчёт партнёрам (в теле письма одна строка плюс текстовый файл). Программа первый день отправляет отчёт правильно, а второй день отправляется письмо без аттача, и с пустым содержанием. Что подскажете? Нужна какая-нибудь процедура повторной инициализации?

zamevur
zamevur
27/07/2011 16:52

посмотрел метод TGMailSMTP.SendMessage при первом приближении вроде всё в норме, надо изучать детальнее

bob
bob
29/02/2012 18:25

Сначала проглядел строчку SMTP.AutoTLS := True; в функции SendToRaw — ничего не работало. Потом пошел по ссылке на предыдущую статью и прочитал это. Исправил — заработало. Спасибо. Хотелось бы еще посмотреть на пример с POP3

LexoTpoH
LexoTpoH
27/04/2012 09:42

ничего не работает, чего вы пишете?! при компиляции на ваш, Влад, исходник ругается что классы не найдены, хотя я дирректорию прописал в дельфях, при игноре этой шняги вылетает с ошибкой обращения по неправильному адресу… вообщем нифига не работает

LexoTpoH
LexoTpoH
27/04/2012 17:30

Влад, не держите меня за дурака, я прекрасно знаю как работать в Делфях) однако факт остается фактом не видит: class TGMailSMTP not found

Дмитрий Конопацкий

Добрый день, Влад! Извиняюсь за наглость, но не могли бы вы выкинуть исходник какого-либо почтовика, но чтоб он точно работал с почтой Gmail.com. Неделю пытаюсь, но так ничего и не сделал:( Скачал тучу программ, но не одна не работает. Надеюсь хотя бы Вы мне поможете!

Дмитрий Конопацкий

Главное чтоб корректно принимались и открывались письма, а отправка не обязательна

Юрий Загорянский

Synapse работает отлично, но есть пару вопросов, может кто сталкивался?!
1. при отправки парта html независимо ручками или из файла всегда добавляется точка в сообщение.
2. Проверка доставки сообщения(замечу НЕ прочтения) кто пробовал осуществить?

Юрий Загорянский

???xml version=»1.0″?> вот такая бяка вылазит вместо точки в кодировки iso-2022-kr, может кто подскажет в какую сторону капать?

Dimon
Dimon
29/10/2012 15:32

Использую Ваш компонент для отправки писем.
Ситуация следующая, первое письмо отправляется с текстом, но если очистить строки, то второе письмо уже приходит пустое! Как исправить проблему?

Андрей
Андрей
24/01/2013 22:53

Уважаемый Влад,очень рад что нашёл на просторах интернета ваш сайт с такими замечательными статьями для работы с Synapse. У меня к вам такой вопрос, а не могли бы вы написать ешё одну статейку о том как вы создавали компонент для отправки почты с гмаил? ХОчется увидеть как создавать сам компанент для дефли и как работать при этом (при создании компанента) с синапсом…

Андрей
Андрей
28/02/2013 03:04

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

ОТправка осуществляется из базы, одно письмо на одну запись.
Первой записи получается отправить, а остальным шиш…

Андрей
Андрей
28/02/2013 03:07

Думаю что это связано с

procedure TGMailSMTP.Clear;
begin
FMsg.Clear;
FFiles.Clear;
FRecipients.Clear;
end;

а точнее с FMsg.Clear; Знаний мало, чтобы копать дальше, мб вы проверите всё ли правильно?

Павел
Павел
26/08/2013 17:35

При работе с объектом, после отправки с aClear=true при вызове метода AddHTML (AddText) содержимое тела письма пустое.
Решается так:
procedure TGMailSMTP.Clear;
begin
FMsg.Clear;
FMIMEPart.Clear;
FMIMEPart:=FMsg.AddPartMultipart(‘alternate’,nil);
FFiles.Clear;
FRecipients.Clear;
end;