Т.к. в первом посте, касающимя работы с 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 и мы всё время будем получать вместо результата - облом.
Так что первое, что нам необходимо - это скачать необходимые библиотеки, а именно:
- libeay32.dll
- 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.
Сегодня посмотрел отрывки из презентации нац.проекта про поисковые системы, а точнее систему, финансируемую нашим государством...интересно Google сразу за фаервол спрячут или нет? :).
--------------------------------------------------------------------
| Делись! | Загружай! | Плюсуй! |
| | |









17 Июл 2010 в 9:38 пп
Спасибо! Теперь все работает как часы ;)
17 Июл 2010 в 9:56 пп
Кстати, всегда хотел узнать насчет сравнения возможностей: Indy, ICS и Synapse. Мне кажется это может стать неплохой темой для будущих статей с выводом в конце о том, что и где лучше использовать.
17 Июл 2010 в 10:15 пп
И еще актуальным является вопрос о кодировке заголовка сообщения и отправителя — в веб-интерфейсе (пробовал на мейл и на гмейл) все выглядит прекрасно, а вот, например Outlook видит только множество ???????????.
17 Июл 2010 в 10:38 пп
Надо будет надосуге подумать над такой темкой. Спасибо за идею :)
17 Июл 2010 в 10:39 пп
С этим не разбирался, т.к. почтовыми клиентами дома не пользуюсь. Тож гляну ;)
18 Июл 2010 в 12:40 дп
Возникло такое предложение. Почему бы не сделать проект Delphi for Internet и не собрать бы в нем все компоненты для работы с различными сервисами в интернете — gmail, Twitter, contacts, …
Система может работать с несколькими транспортными уровнями — Indy, ice, synapse.
18 Июл 2010 в 12:58 дп
Ну как бы стремление к этому есть. Как могу — стараюсь осветить все вопросы, касающиеся различных API в этом блоге. Другое дело, что я один, а API — много :). Есть проект Google API в Delphi — где мы пытаемся собрать в одном месте библиотеки и компоненты для работы с Google API, в т.ч. там же лежит модуль для GMAil. Сами понимаете — Google имеет весьма большие как по объему так и по возможностям API — поэтому основной упор в работе именно на этой части и бросать этот проект, честно говоря, было б очень жаль.
По поводу Twitter, в принципе, кое-какие наработки есть по этому вопросу, если есть желание начать полномасштабную разработку его API для Delphi — могу посодействовать в работе. Для бесплатного проекта на том же GitHub или Google Code — помогу безвозмездно по мере сил и возможностей.
Также есть кое-какие намётки по FriendFeed API — достаточно простой API, но возможности не плохие.
API RuTwit‘а здесь не рассматривал, но в целом — это практически копия Твиттера.
Есть по работе с WordPress кое-что, но до более-менее серьезных работ дело, к сожалению, не дошло.
Так что былоб 10 рук, то можно было бы и начать :)
18 Июл 2010 в 5:18 дп
Если вам несложно не могли бы вы выложить программу-пример, а то у меня никак не получается отправить почту с помощью synapse.
18 Июл 2010 в 2:14 пп
не сложно :). Правда сейчас все исходники, касающиеся Гугла лежат в репозитории на github. Тот исходник, который интересует Вас лежит здесь — в моей ветке. Там же найдете и необходимые DLL-ки.
Zip-архив с компонентом и Demo-проектом здесь
20 Июл 2010 в 9:13 пп
В приведенном вами примере есть одна очень интересная особенность
если в Memo1 вписать только одну строку добавить ее к письму и отправить то получатель получит пустое письмо.
Никак не пойму почему это происходит, не могли бы прокомментировать почему так происходит?
20 Июл 2010 в 9:37 пп
VahaC. Не могу :) Сейчас отправил себе на посту на mail.ru строку «Привет» — пришла 1 строка «Привет». Вы после того как в мемо1 текст пишете кнопку «Добавить как текст» жмете?
21 Июл 2010 в 3:40 дп
конечно
26 Июл 2011 в 3:15 пп
Добрый день Vlad. Заметил странную особенность. Мне каждый день нужно отправлять автоматически один отчёт партнёрам (в теле письма одна строка плюс текстовый файл). Программа первый день отправляет отчёт правильно, а второй день отправляется письмо без аттача, и с пустым содержанием. Что подскажете? Нужна какая-нибудь процедура повторной инициализации?
26 Июл 2011 в 7:21 пп
Евгений, я с почтой в Synapse плотно не работал — все по мелочам типа 1 раз принять письмо, 1 раз отправить, но по-моему никаких переприсвваиваний значений свойств для TSMTPSend не требуется — объект вроде бы после отправки данные не затирает. Посмотрите на метод в котором происходит отправка письма, думаю, там будет ответ на Ваш вопрос
27 Июл 2011 в 4:52 пп
посмотрел метод TGMailSMTP.SendMessage при первом приближении вроде всё в норме, надо изучать детальнее