После первой публикации в блоге статьи про работу 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 - в этом посте.
| Делись! | Загружай! | Плюсуй! |
| | |









24 Мар 2010 в 6:23 пп
Все работает, только в качестве параметра хост надо через двоеточие указать порт. У меня кстати на 495 порт почему-то не отправляет, а на порт 587 без проблем.
smtpsend.SendToRaw(pFrom, pTo, ‘smtp.gmail.com:587′, tmpMsg.Lines, ‘LOGIN@gmail.com’, ‘PASSWORD’);
24 Мар 2010 в 6:32 пп
я, когда пост писал, никаких портов не указывал. Все как в посте сказано — так и делал…не думаю, что это от версии Delphi зависит…
24 Мар 2010 в 6:32 пп
Интересно узнать, а как приделать progressbar к этой программе, чтобы как в настоящих клиентах он закрашивался по мере передачи сообщения. Так же не понятно как указывать кодировку отправляемого письма (юникод, вин1251, кои8р)
26 Мар 2010 в 3:01 пп
Спасибо за статью.
А как по поводу работы через proxy?
26 Мар 2010 в 3:24 пп
Ну так Synapse с proxy дружит :)
10 Апр 2010 в 4:50 пп
Енто так и было задумано испоганить нормальый код вполне независмиой процедуры?
Добавлением строчек:
//прицепляем к письму файл
if Form1.Edit1.Text» then
tmpMsg.AddPartBinaryFromFile(Form1.Edit1.Text,tmpMIMEPart)
Логичнее на вход добавить: AttFiles: String или AttFiles: TStrings (смотря как вам удобнее парсить внутри функции).
Тоже самое касется забитых ‘LOGIN@gmail.com’, ‘PASSWORD’ прямо в текст. Лучше через параметры на вход передавать.
Так же имеет смысл перестроить порядок параметров и части параметров присвоить значения по умолчанию. :)
Мы у себя накатали подобную функцию, вынесли её в отдельный модуль, и там где надо легко цепляем в проектах, очень удобно.
10 Апр 2010 в 5:00 пп
Очень за вас рад, продолжайте в том же духе
14 Апр 2010 в 2:54 пп
А можете выложить плз исходник рабочей версии программы етого примера а то мой чтото не работает. спасибо.
19 Апр 2010 в 3:10 пп
Для тех у кого не отправляются письма.
Необходимо иметь библиотеки (ssleay32.dll, libeay32.dll) в директории программы.
Взять можно http://indy.fulgan.com/SSL/Archive/indy_openssl096.zip
16 Июл 2010 в 4:23 пп
2fank, а при чем тут Indy? )
09 Авг 2010 в 2:13 пп
Добавь для TGMailSMTP в Destroy «FMsg.Free;», а то утечка памяти
destructor TGMailSMTP.Destroy;
begin
FFiles.Free;
FRecipients.Free;
FMsg.Free;
inherited;
end;
09 Авг 2010 в 7:03 пп
SergeyRock, спасибо. Поправил. Обновленный модуль находится здесь:
http://github.com/googleapi/googleapi/tree/master/packages/gmail_pack/
04 Окт 2010 в 12:51 дп
совсем для чайников объясните, плиз, как в uses подключить модуль ssl_openssl ?
04 Окт 2010 в 1:08 дп
Алексей…я как бы в тупике…но всё-таки попробую объяснить. находите раздел uses в модуле, ставите запятую перед знаком ; и сразу же пишите ssl_openssl. Должно получиться как-то так: uses …., sslopen_ssl; вместо троеточия — куча всяких других модулей.
04 Окт 2010 в 3:12 пп
Странно, но когда я отсылаю почту с gmail на mail, то письмо приходит на оба ящика.
04 Окт 2010 в 3:15 пп
А может стоит в GMailSMTP.pas объединить Login и FromEmail, так как авторизоваться можно и по FromMail. Или я ошибаюсь и где-то действительно нужен параметр FromMail?
04 Окт 2010 в 4:11 пп
Проверяйте правильность заполнения поля получателя
04 Окт 2010 в 4:12 пп
авторизуетесь с ящика накоторый отсылаете письмо — получить два письма на оба ящика :)
12 Янв 2011 в 2:39 пп
Огромное спасибо за полезную информацию. Долго бегал с бубном вокруг IdSMTP. А тут все и сразу получилось, нарадоваться не могу. Еще есть вопрос, а как отправить скрытую копию письма через Synapse