Подписка

добавить на Яндекс

Наши проекты

Delphi+Google

Google API

Google API в Delphi - проект с открытым исходным кодом.

Chrono

Chrono

Хронометр - программа для ведения списка задач.

ODFProc

ODFProc

ODFProc - работа с документами OpenOffice в Lazarus и FreePascal.

Поддержка блога

А тут я коплю на лицензию Delphi XE на iPad =).
Сумма пожертвования не фиксирована.

Публикации

Год назад

Случайный пост

Последние

Сообщения форума

Комментарии

Социальные сети

Google

Facebook

Twitter

Опрос

Вы сейчас или в ближайшем обозримом будущем планируете разрабатывать кроссплатформенное приложение с использованием Firemonkey?



Loading ... Loading ...

Блоги и сообщества

Статьи по Delphi DelphiFeeds.ru - Все Delphi-блоги Рунета Сообщество умных людей VR-Online.RU Бесплатный журнал для программистов и всех, кто интересуется IT Статьи и уроки по Delphi Новостной блог о высоких технологиях
Система Orphus
Опубликовал Vlad 17 июля 2010 в 20:44.
Категории: Delphi в Web.


Т.к. в первом посте, касающимя работы с 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.

--------------------------------------------------------------------
Сегодня посмотрел отрывки из презентации нац.проекта про поисковые системы, а точнее систему, финансируемую нашим государством...интересно Google сразу за фаервол спрячут или нет? :).
--------------------------------------------------------------------
Понравилась статья? Тогда:
Делись! Загружай! Плюсуй!
   Отправить PDF на   
Читай ещё статьи на WebDelphi.ru

Комментарии (15)

WP_Cloudy
  • Keeper пишет:

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

  • Keeper пишет:

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

  • Keeper пишет:

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

  • Vlad пишет:

    Надо будет надосуге подумать над такой темкой. Спасибо за идею :)

  • Vlad пишет:

    С этим не разбирался, т.к. почтовыми клиентами дома не пользуюсь. Тож гляну ;)

  • Deksden пишет:

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

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

  • Vlad пишет:

    Ну как бы стремление к этому есть. Как могу — стараюсь осветить все вопросы, касающиеся различных API в этом блоге. Другое дело, что я один, а API — много :). Есть проект Google API в Delphi — где мы пытаемся собрать в одном месте библиотеки и компоненты для работы с Google API, в т.ч. там же лежит модуль для GMAil. Сами понимаете — Google имеет весьма большие как по объему так и по возможностям API — поэтому основной упор в работе именно на этой части и бросать этот проект, честно говоря, было б очень жаль.
    По поводу Twitter, в принципе, кое-какие наработки есть по этому вопросу, если есть желание начать полномасштабную разработку его API для Delphi — могу посодействовать в работе. Для бесплатного проекта на том же GitHub или Google Code — помогу безвозмездно по мере сил и возможностей.
    Также есть кое-какие намётки по FriendFeed API — достаточно простой API, но возможности не плохие.
    API RuTwit‘а здесь не рассматривал, но в целом — это практически копия Твиттера.
    Есть по работе с WordPress кое-что, но до более-менее серьезных работ дело, к сожалению, не дошло.
    Так что былоб 10 рук, то можно было бы и начать :)

  • VahaC пишет:

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

  • Vlad пишет:

    не сложно :). Правда сейчас все исходники, касающиеся Гугла лежат в репозитории на github. Тот исходник, который интересует Вас лежит здесь — в моей ветке. Там же найдете и необходимые DLL-ки.
    Zip-архив с компонентом и Demo-проектом здесь

  • VahaC пишет:

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

  • Vlad пишет:

    VahaC. Не могу :) Сейчас отправил себе на посту на mail.ru строку «Привет» — пришла 1 строка «Привет». Вы после того как в мемо1 текст пишете кнопку «Добавить как текст» жмете?

  • VahaC пишет:

    конечно

  • Евгений пишет:

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

  • Vlad пишет:

    Евгений, я с почтой в Synapse плотно не работал — все по мелочам типа 1 раз принять письмо, 1 раз отправить, но по-моему никаких переприсвваиваний значений свойств для TSMTPSend не требуется — объект вроде бы после отправки данные не затирает. Посмотрите на метод в котором происходит отправка письма, думаю, там будет ответ на Ваш вопрос

  • zamevur пишет:

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

Ваш ответ

Внимание: Все комментарии модерируются, и это может вызвать задержку их публикации. Отправлять комментарий заново не требуется.

Пожалуйста, заключайте исходный код в тэги [code][/code].
Если код большой, то воспользуйтесь Вставкой кода на отдельной странице и оставьте в комментарии ссылку на исходник