Подписка

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

Наши проекты

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 23 марта 2010 в 17:27.
Категории: Delphi в Web.


После первой публикации в блоге статьи про работу Synapse с SMTP не только в комментариях к статье, но и на почту получил ряд вопросов и предложений рассмотреть работу с почтой gmail.com от Google. Честно сказать, я не знаю в чем заключается проблема отправки писем с использованием smtp.gmail.com, но всё же рассмотрю пример работы с этим почтовым сервисом. Лишней, думаю, информация не будет.

Итак, в начале рассмотрим, что такого особенного в работе Gmail.com. Во-первых, в вашем аккаунте по умолчанию отключен протокол POP3. Его необходимо включать самому в настройках. Во-вторых, сервер исходящей почты (smtp) использует SSL (порт 495). Вроде бы больше отличий никаких не обнаружилось. Что ж, воспользуемся заготовкой приложения, которую мы использовали при отправке писем с вложениями.
Так как в работе используется ssl, то обязательно в uses необходимо подключить модуль ssl_openssl. Если этого не сделать, то при работе программы никаких исключений не будет, но и письмо мы отправить не сможем. Такая вот особенность Synapse. Кстати, этот же модуль необходимо подключать при работе с https.
Итак, модуль подключен. Осталась мелочь - правильно указать логин и пароль и отправить письмо. Может быть здесь у кого-то возникали проблемы? Дело в том, что логин должен содержать @gmail.com. Например, я регистрировал аккаунт Google, используя адрес email с mail.ru, но после того как завел аккаунт в GMail, то основным адресом почты в аккаунте стал v...3@gmail.com - это и есть мой логин для smtp.gmail.com. Соответственно пароль тот же, что и у аккаунта Google.
На всякий случай, приведу полный листинг процедуры отправки письма с gmail.com:

Procedure SendMail (pHost, pSubject, pTo, pFrom , pTextBody, pHTMLBody : string);
var tmpMsg : TMimeMess;
     tmpStringList : TStringList;
     tmpMIMEPart : TMimePart;
begin
    tmpMsg := TMimeMess.Create;
    tmpStringList := TStringList.Create;
    try
     // Headers
     tmpMsg.Header.Subject := pSubject;
     tmpMsg.Header.From := pFrom;
     tmpMsg.Header.ToList.Add(pTo);
     // MIMe Parts
     tmpMIMEPart := tmpMsg.AddPartMultipart('alternate',nil);
     if length(pTextBody)>0 then
       begin
         tmpStringList.Text := pTextBody;
         tmpMsg.AddPartText(tmpStringList, tmpMIMEPart);
       end
     else
       begin
         tmpStringList.Text := pHTMLBody;
         tmpMsg.AddPartHTML(tmpStringList, tmpMIMEPart);
       end;
     //прицепляем к письму файл
     if Form1.Edit1.Text<>'' then
        tmpMsg.AddPartBinaryFromFile(Form1.Edit1.Text,tmpMIMEPart)
     // Encode and send
     tmpMsg.EncodeMessage;
     smtpsend.SendToRaw(pFrom, pTo, pHost, tmpMsg.Lines, 'LOGIN@gmail.com', 'PASSWORD');
  finally
   tmpMsg.Free;
   tmpStringList.Free;
  end;
end;

Пробуем отправить письмо, например, на yandex.ru. Письмо приходит с небольшой задержкой, но тем не менее вот результат:

Теперь попробуем отправить письмо НА gmail.com, используя ту же процедуру отправки:

Письмо пришло практически моментально. Таким образом, можно сказать, что работа с сервером smtp.gmail.com в Synapse практически ничем не отличается от работы с аналогичными серверами. Единственный момент - это необходимость подключения модуля ssl_openssl в uses.

UPDATE: Последние изменения компонента для отправки писем с GMail выложены в нашем репозитории. Последняя информация по работе с GMAil и Synapse - в этом посте.

Пока Вы будете разбираться с отправкой писем с GMail.com, я пойду поизучаю правила игры в техасский покер. Говорят, что игра в покер очень сильно затягивает. Может научусь зарабатывать деньги играючи :)
Понравилась статья? Тогда:
Делись! Загружай! Плюсуй!
   Отправить PDF на   
Читай ещё статьи на WebDelphi.ru

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

WP_Cloudy
  • Станислав пишет:

    Все работает, только в качестве параметра хост надо через двоеточие указать порт. У меня кстати на 495 порт почему-то не отправляет, а на порт 587 без проблем.

    smtpsend.SendToRaw(pFrom, pTo, ‘smtp.gmail.com:587′, tmpMsg.Lines, ‘LOGIN@gmail.com’, ‘PASSWORD’);

  • Vlad пишет:

    я, когда пост писал, никаких портов не указывал. Все как в посте сказано — так и делал…не думаю, что это от версии Delphi зависит…

  • Станислав пишет:

    Интересно узнать, а как приделать progressbar к этой программе, чтобы как в настоящих клиентах он закрашивался по мере передачи сообщения. Так же не понятно как указывать кодировку отправляемого письма (юникод, вин1251, кои8р)

  • Genniy пишет:

    Спасибо за статью.
    А как по поводу работы через proxy?

  • Vlad пишет:

    Ну так Synapse с proxy дружит :)

  • FreshMeat пишет:

    Енто так и было задумано испоганить нормальый код вполне независмиой процедуры?
    Добавлением строчек:
    //прицепляем к письму файл
    if Form1.Edit1.Text» then
    tmpMsg.AddPartBinaryFromFile(Form1.Edit1.Text,tmpMIMEPart)

    Логичнее на вход добавить: AttFiles: String или AttFiles: TStrings (смотря как вам удобнее парсить внутри функции).

    Тоже самое касется забитых ‘LOGIN@gmail.com’, ‘PASSWORD’ прямо в текст. Лучше через параметры на вход передавать.

    Так же имеет смысл перестроить порядок параметров и части параметров присвоить значения по умолчанию. :)

    Мы у себя накатали подобную функцию, вынесли её в отдельный модуль, и там где надо легко цепляем в проектах, очень удобно.

  • Vlad пишет:

    Мы у себя накатали подобную функцию, вынесли её в отдельный модуль, и там где надо легко цепляем в проектах, очень удобно

    Очень за вас рад, продолжайте в том же духе

  • Сергей пишет:

    А можете выложить плз исходник рабочей версии программы етого примера а то мой чтото не работает. спасибо.

  • 2fank пишет:

    Для тех у кого не отправляются письма.
    Необходимо иметь библиотеки (ssleay32.dll, libeay32.dll) в директории программы.

    Взять можно http://indy.fulgan.com/SSL/Archive/indy_openssl096.zip

  • Keeper пишет:

    2fank, а при чем тут Indy? )

  • SergeyRock пишет:

    Добавь для TGMailSMTP в Destroy «FMsg.Free;», а то утечка памяти

    destructor TGMailSMTP.Destroy;
    begin
    FFiles.Free;
    FRecipients.Free;
    FMsg.Free;
    inherited;
    end;

  • Vlad пишет:

    SergeyRock, спасибо. Поправил. Обновленный модуль находится здесь:
    http://github.com/googleapi/googleapi/tree/master/packages/gmail_pack/

  • Алексей пишет:

    совсем для чайников объясните, плиз, как в uses подключить  модуль ssl_openssl ?

  • Vlad пишет:

    Алексей…я как бы в тупике…но всё-таки попробую объяснить. находите раздел uses в модуле, ставите запятую перед знаком ; и сразу же пишите ssl_openssl. Должно получиться как-то так: uses …., sslopen_ssl; вместо троеточия — куча всяких других модулей.

  • Антон пишет:

    Странно, но когда я отсылаю почту с gmail на mail, то письмо приходит на оба ящика.

  • Антон пишет:

    А может стоит в GMailSMTP.pas объединить Login и FromEmail, так как авторизоваться можно и по FromMail. Или я ошибаюсь и где-то действительно нужен параметр FromMail?

  • Vlad пишет:

    Проверяйте правильность заполнения поля получателя

  • Vlad пишет:

    авторизуетесь с ящика накоторый отсылаете письмо — получить два письма на оба ящика :)

  • Sashaua пишет:

    Огромное спасибо за полезную информацию. Долго бегал с бубном вокруг IdSMTP. А тут все и сразу получилось, нарадоваться не могу.  Еще есть вопрос, а как отправить скрытую копию письма через Synapse

Ваш ответ

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

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