уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.

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

0 0 голоса
Рейтинг статьи
уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.
Подписаться
Уведомить о
27 Комментарий
Межтекстовые Отзывы
Посмотреть все комментарии
Станислав
Станислав
24/03/2010 18:23

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

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

Станислав
Станислав
24/03/2010 18:32

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

Genniy
Genniy
26/03/2010 15:01

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

FreshMeat
FreshMeat
10/04/2010 16:50

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

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

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

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

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

Сергей
Сергей
14/04/2010 14:54

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

2fank
2fank
19/04/2010 15:10

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

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

Keeper
16/07/2010 16:23

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

SergeyRock
09/08/2010 14:13

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

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

Алексей
Алексей
04/10/2010 00:51

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

Антон
Антон
04/10/2010 15:12

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

Антон
Антон
04/10/2010 15:15

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

Sashaua
Sashaua
12/01/2011 14:39

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

Alexander
Alexander
21/02/2012 22:41

var
mm: TMimemess;
..
begin

mm := TMimemess.create;  
mm.Header.CCList.Add(copymail);; 

DDM
DDM
06/06/2012 16:59

У меня соединение устанавливается,но ничего не передается(

Edward
27/12/2013 16:34

Большое спасибо за статью — столько искал, работающий код нашёл только у вас

ttRex
ttRex
26/04/2014 13:47

Спасибо, все работает как часы :) Нашел маленький минус — после использования метода Clear, перестает посылать тело письма. Лечится добавлением в метод Clear строки:
FMIMEPart:=FMsg.AddPartMultipart(‘alternate’,nil);

trackback

[…] параметр HOSTED, то можно привести пример с тем же GMail. Имея бесплатный почтовый аккаунт Вы можете без […]

Павел
16/09/2014 20:57

Здравствуйте.

Сегодня яндекс ввел шифрование ssl для работы с почтой. Надеялся, что приведенный пример мне поможет, но на моменте SMTP.Login в методе SendToRaw у меня происходит залипон секунд на 10 и логин не проходит.

Входные параметры в процедуру указывал
SendMail(‘smtp.yandex.ru:495’, ‘проверка отправки’, ‘PBednyagin@mail.ru’, ‘softerium@yandex.ru’, ‘Проверка тела письма’, »);

dll-ки копировал, порт 587 менять пробовал, не помогло :(

Кто-нибудь уже эксперементировал с яндексом?

Viacheslav
Viacheslav
18/09/2014 12:24
Ответить на  Павел

FSMTP.TargetHost:= smtp_url;
FSMTP.TargetPort:= smtp_port;
FSMTP.UserName:= smtp_username;
FSMTP.Password:= smtp_pass;
FSMTP.FullSSL:= True;
Result:= FSMTP.Login and FSMTP.AuthDone;
//——
но при этом не забудь подключить в uses ssl_openssl; и к exe’шнику в папку бросить две dll’ки ssleay32.dll и libeay32.dll

Вячеслав
Вячеслав
07/10/2014 12:44
Ответить на  Павел

Например у меня работает так:
SMTPClient.TargetHost:=’smtp.yandex.ru’;
SMTPClient.TargetPort:=25;
SMTPClient.UserName:=edUser.Text;
SMTPClient.Password:=edPassword.Text;
SMTPClient.AutoTLS:=true;
В uses ssl_openssl + библиотеки в папке программы. Все работает на ура.