Т.к. в первом посте, касающимя работы с 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.
Книжная полка
Описание: Рассмотрены практические вопросы по разработке клиент-серверных приложений в среде Delphi 7 и Delphi 2005 с использованием СУБД MS SQL Server 2000, InterBase и Firebird. Приведена информация о теории построения реляционных баз данных и языке SQL. Освещены вопросы эксплуатации и администрирования СУБД.
|
||
Название: О чем не пишут в книгах по Delphi
Описание: Рассмотрены малоосвещенные вопросы программирования в Delphi. Описаны методы интеграции VCL и API. Показаны внутренние механизмы VCL и приведены примеры вмешательства в эти механизмы. Рассмотрено использование сокетов в Delphi: различные режимы их работы, особенности для протоколов TCP и UDP и др.
|
Спасибо! Теперь все работает как часы ;)
Кстати, всегда хотел узнать насчет сравнения возможностей: Indy, ICS и Synapse. Мне кажется это может стать неплохой темой для будущих статей с выводом в конце о том, что и где лучше использовать.
Надо будет надосуге подумать над такой темкой. Спасибо за идею :)
И еще актуальным является вопрос о кодировке заголовка сообщения и отправителя — в веб-интерфейсе (пробовал на мейл и на гмейл) все выглядит прекрасно, а вот, например Outlook видит только множество ???????????.
С этим не разбирался, т.к. почтовыми клиентами дома не пользуюсь. Тож гляну ;)
Возникло такое предложение. Почему бы не сделать проект Delphi for Internet и не собрать бы в нем все компоненты для работы с различными сервисами в интернете — gmail, Twitter, contacts, …
Система может работать с несколькими транспортными уровнями — Indy, ice, synapse.
Ну как бы стремление к этому есть. Как могу — стараюсь осветить все вопросы, касающиеся различных API в этом блоге. Другое дело, что я один, а API — много :). Есть проект Google API в Delphi — где мы пытаемся собрать в одном месте библиотеки и компоненты для работы с Google API, в т.ч. там же лежит модуль для GMAil. Сами понимаете — Google имеет весьма большие как по объему так и по возможностям API — поэтому основной упор в работе именно на этой части и бросать этот проект, честно говоря, было б очень жаль. По поводу Twitter, в принципе,… Подробнее »
Если вам несложно не могли бы вы выложить программу-пример, а то у меня никак не получается отправить почту с помощью synapse.
не сложно :). Правда сейчас все исходники, касающиеся Гугла лежат в репозитории на github. Тот исходник, который интересует Вас лежит здесь — в моей ветке. Там же найдете и необходимые DLL-ки.
Zip-архив с компонентом и Demo-проектом здесь
В приведенном вами примере есть одна очень интересная особенность
если в Memo1 вписать только одну строку добавить ее к письму и отправить то получатель получит пустое письмо.
Никак не пойму почему это происходит, не могли бы прокомментировать почему так происходит?
VahaC. Не могу :) Сейчас отправил себе на посту на mail.ru строку «Привет» — пришла 1 строка «Привет». Вы после того как в мемо1 текст пишете кнопку «Добавить как текст» жмете?
конечно
Добрый день Vlad. Заметил странную особенность. Мне каждый день нужно отправлять автоматически один отчёт партнёрам (в теле письма одна строка плюс текстовый файл). Программа первый день отправляет отчёт правильно, а второй день отправляется письмо без аттача, и с пустым содержанием. Что подскажете? Нужна какая-нибудь процедура повторной инициализации?
Евгений, я с почтой в Synapse плотно не работал — все по мелочам типа 1 раз принять письмо, 1 раз отправить, но по-моему никаких переприсвваиваний значений свойств для TSMTPSend не требуется — объект вроде бы после отправки данные не затирает. Посмотрите на метод в котором происходит отправка письма, думаю, там будет ответ на Ваш вопрос
посмотрел метод TGMailSMTP.SendMessage при первом приближении вроде всё в норме, надо изучать детальнее
Сначала проглядел строчку SMTP.AutoTLS := True; в функции SendToRaw — ничего не работало. Потом пошел по ссылке на предыдущую статью и прочитал это. Исправил — заработало. Спасибо. Хотелось бы еще посмотреть на пример с POP3
ничего не работает, чего вы пишете?! при компиляции на ваш, Влад, исходник ругается что классы не найдены, хотя я дирректорию прописал в дельфях, при игноре этой шняги вылетает с ошибкой обращения по неправильному адресу… вообщем нифига не работает
LexoTpoH, Вы первый из более 100 человек у кого НИЧЕГО не работает в этом исходнике. Может сначала стоит почитать как правильно работать с IDE Delphi? :) Проверил исходник ещё раз (Delphi XE2, Win XP) — работает
Влад, не держите меня за дурака, я прекрасно знаю как работать в Делфях) однако факт остается фактом не видит: class TGMailSMTP not found
LexoTpoH, может уже хватит телепата из меня делать, а? :) Пойдем по-порядку: 1. Вы исходник с TGMailSMTP откуда брали? Отсюда — https://github.com/googleapi/googleapi/downloads? или просто демку скачали и пробуете без необходимого класса её собрать? 2. Если скачали архив по приведенной ссылке, то компонент на палитру установили? Если не нравится/не получается установить компонент — нет проблем, тогда просто подключаете в проект модуль GMailSMTP и создаете класс TGMailSMTP руками в OnCreate форму или где вам будет угодно. 3. Без компонента в палитре демка из архива будет ругаться на то, что не нашла компонент — как избавиться от этой ошибки — см. п.2 Демка… Подробнее »
Добрый день, Влад! Извиняюсь за наглость, но не могли бы вы выкинуть исходник какого-либо почтовика, но чтоб он точно работал с почтой Gmail.com. Неделю пытаюсь, но так ничего и не сделал:( Скачал тучу программ, но не одна не работает. Надеюсь хотя бы Вы мне поможете!
Главное чтоб корректно принимались и открывались письма, а отправка не обязательна
Synapse работает отлично, но есть пару вопросов, может кто сталкивался?!
1. при отправки парта html независимо ручками или из файла всегда добавляется точка в сообщение.
2. Проверка доставки сообщения(замечу НЕ прочтения) кто пробовал осуществить?
???xml version=»1.0″?> вот такая бяка вылазит вместо точки в кодировки iso-2022-kr, может кто подскажет в какую сторону капать?
Использую Ваш компонент для отправки писем.
Ситуация следующая, первое письмо отправляется с текстом, но если очистить строки, то второе письмо уже приходит пустое! Как исправить проблему?
Уважаемый Влад,очень рад что нашёл на просторах интернета ваш сайт с такими замечательными статьями для работы с Synapse. У меня к вам такой вопрос, а не могли бы вы написать ешё одну статейку о том как вы создавали компонент для отправки почты с гмаил? ХОчется увидеть как создавать сам компанент для дефли и как работать при этом (при создании компанента) с синапсом…
Столкнулся с такой проблемой, после отправки, прикреплённые файлы уходят только при первой отправке, другим же адресам письма уходят без файлов.
ОТправка осуществляется из базы, одно письмо на одну запись.
Первой записи получается отправить, а остальным шиш…
Думаю что это связано с
procedure TGMailSMTP.Clear;
begin
FMsg.Clear;
FFiles.Clear;
FRecipients.Clear;
end;
а точнее с FMsg.Clear; Знаний мало, чтобы копать дальше, мб вы проверите всё ли правильно?
При работе с объектом, после отправки с aClear=true при вызове метода AddHTML (AddText) содержимое тела письма пустое.
Решается так:
procedure TGMailSMTP.Clear;
begin
FMsg.Clear;
FMIMEPart.Clear;
FMIMEPart:=FMsg.AddPartMultipart(‘alternate’,nil);
FFiles.Clear;
FRecipients.Clear;
end;