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

В качестве небольшого бонуса своим читателям, которые заинтересовались работой с почтой GMail из Delphi, написал небольшой компонент для отправки писем через аккаунт GMail. В принципе, сам по себе этот компонент может использоваться для работы и с другими smtp-серверами, например, с mail.ru, но обо всем по порядку.

Во-первых, сразу предупреждаю, что для работы компонента необходимо иметь под рукой библиотеку Synapse. Так уж сложилось, что с ней мне работать намного удобнее, чем с Indy.
Во-вторых, скачать компонент, а также его исходники Вы можете со страницы нашего общего проекта на Google Code.
Теперь, непосредственно по работе с компонентом. У компонента TGmailSMTP определены следующие публичные свойства:
Login: string — логин для smtp-сервера. У Gmail совпадает с адресом электронной почты
Password: string — пароль для smtp-сервера. Совпадает с парольем к аккаунту
Host: string — хост smtp-сервера. По умолчанию smtp.gmail.com
FromEmail: string — адрес email с которого отправляется письмо
FromName: string — имя отправителя
Port: integer — порт. По умолчанию 587. Если значение равно 0, то используется порт по умолчанию для smtp
AttachFiles: TStrings — список файлов для отправки
Recipients: TStrings — список адресов получателей
А также для свойства для работы непосредственно с объектами Synapse:

property GMessage:TMimeMess read FMsg write FMsg;
property MIMEPart:TMimePart read FMIMEPart write FMIMEPart;

Для отправки письма всем получателям используется метод:

function SendMessage(const aSubject:string; aClear:boolean=true):boolean;

Параметры метода:
aSubject:string — тема отправляемого письма
aClear:boolean — определяет будут ли очищены все поля сообщения после отправки.
В целом, работа с компонентом проста как три копейки:
1. Кидаете компонент на форму
2. Заполняете поля. При этом поле FromName может оставаться пустым
3. Вызываете метод SendMessage
Компонент протестирован на Delphi 2010, письма отправлялись с gmail.com на mail.ru и yandex.ru, а также наоборот — с mail.ru на gmail.com. При отправки письма не с gmail свойство port должно быть равно 0 или содержать номер пора по умолчанию.
Демо по работе с компонентом также находится на странице загрузок нашего проекта.

UPDATE: Tсли компонент не отправляет письма — читайте этот пост. Вполне возможно, что проблема в отсутствии необходимых DLL

0 0 голоса
Рейтинг статьи
уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.
Подписаться
Уведомить о
27 Комментарий
Межтекстовые Отзывы
Посмотреть все комментарии
Александр
16/04/2010 22:09

Хорошо бы ещё указать, чем это отличается от стандартного компонента SMTP.

Роман
17/04/2010 00:10

В чем может быть проблема:
хочу отправить с mail.ru — ввожу Login, Password, Host(smtp.mail.ru) — не отправляет
хочу отправить с gmail.com — ввожу Login, Password, Host(smtp.gmail.com) — не отправляет
хочу отправить с rambler.ru — ввожу Login, Password, Host(smtp.rambler.ru) — Отправляет !!!

Роман
17/04/2010 00:53

Так… с mail.ru проблема была на моей стороне)
А с gmail.com всё равно не отправляет(

deksden
deksden
19/04/2010 11:26

Стилистические замечания к коду в GMailSMTP.pas:
property GMessage:TMimeMess read FMsg write FMsg;
property MIMEPart:TMimePart read FMIMEPart write FMIMEPart;

совсем не понимаю, зачем в описании свойств указана write-часть? имхо, такие свойства обычно делаются read-only, чтобы не дать возможность пользователям переписать переменную и допустить утечку памяти!

Алексей (Минск)
Алексей (Минск)
21/04/2010 09:43

Gmail исползует ssl шифрование

Bazar
Bazar
08/07/2010 20:26

а на gmail не отправляет потому что в компоненте запускается функция smtpsend.SendToRaw в которой по умолчанию закомментированы
SMTP.AutoTLS := True; и //SMTP.FullSSL := True;
а gmail требует или ту или другую в зависимости от порта (465 или 587).

Keeper
16/07/2010 20:42

У меня никак не хочет отправляться, SendToRaw всегда вовзращает False. Менять AutoTLS и FullSSL пробовал.

Keeper
16/07/2010 22:33

Смотрел.
ssl_openssl есть, есть POP3, спец. символов в пароле нет. POP3 включается странно: ставлю 1 или второй радиобаттон, жму сохранить, а в настройках по-прежнему ничего не выделено, но написано » Состояние: POP включен для всех писем, полученных с 13 июля.».
Порт указываю 587 (так рекомендовано в настройках + telnet соединяется по нему, по 495 не хочет).

Keeper
16/07/2010 22:36

Код:
[code]
...
Msg.Header.ToList.Add(ATo); //имя и адрес получателя
// создаем корневой элемент
MIMEPart := Msg.AddPartMultipart('alternative', nil);
Msg.AddPartHTML(AHTMLBody, MIMEPart);
// Кодируем и отправляем
Msg.EncodeMessage;
Result := smtpsend.SendToRaw(AFrom, ATo, AHost, Msg.Lines,
ALogin, APassword);
end;
[/code]

Keeper
16/07/2010 23:36

Ок, спасибо )

Юрий
Юрий
19/07/2010 13:28

Пока не поставил Microsoft Visual C++ Runtime Library
почта «тихо» не уходила…Ошибок не выдавала.

zvyagaaa
zvyagaaa
27/10/2011 21:09

Добрый день, пробую ваш компонент, все работает. Решил добавить ProgressBar чтобы видеть как идет закачивание на сервер.  [code] procedure TForm2.GMailSMTP1Status(Sender: TObject; Reason: THookSocketReason;   const Value: string); begin   Application.ProcessMessages;   StatusBar1.Panels[0].Text:=GetEnumName(TypeInfo(THookSocketReason),ord(Reason))+    ' '+Value;   if Reason=HR_WriteCount then   begin    Download:=Download+StrToInt(value);   end; end; [/code]  Размер письма по этому методу получается больше где-то в полтора раза больше размера вложений. Я прекрасно понимаю, что это нормально и что это и служебные запросы и сам формат письма для smtp перекодируется. Из-за этого растет размер. Вопрос же в следующем, как можно адекватно узнать размер отправляемого письма? Ведь по спецификации, как я… Подробнее »

Андрей
Андрей
23/01/2013 01:38

Извините, но установить ваш компанент не получается….

Андрей
Андрей
24/01/2013 13:31
Ответить на  Vlad

Установить получилось только пришлось ручками чуть чуть подправить. Delphi 7. 1. При установке компилятор выдал ошибку на первую строчку, там кракозябры были какето перед фигурной скобкой где идёт описание Убрал. 2. Дальше выдал ошибки на строки {REGION {ENDREGION Закоментил 3. Закинул необходимы файлы *.pas от Synapse которых рядом с компонентам не было. В туже папку с компанентом 4. Пришлось редактировать файл *.dpk (или какое там расширение не помню) в самом конце изменил путь к файлам *.pas и только после этого всё установилось. Не знаю мб криво чтото встало, но отправить почтку с gmail получилось с первого раза. Отдельно хочу сказать… Подробнее »

Игорь
Игорь
21/02/2013 14:23

Привет! Нет возможности скачать компонент: 404 ошибка

Dozent
Dozent
04/03/2013 23:11

Влад, проблемка одна возникла. Отправляю письма из базы, один клиент = одно письмо. Получается что письмо с прикреплёными файлами уходит только первому клиенту, а все остальные письма без прикреплённых файлов!!! ДАже если создать новую рассылку! Вообще получается что рассылка происходит только один раз при запуске проги, а дальше шиш! Мб подскажите почему так?

Dozent
Dozent
05/03/2013 02:29

ну процесс отправки примерно следующий, взяли первого из списка рассылки, получили адрес эл. почты, вписали его в Recipients, получили список путей к файлам для данной рассылки, добавили в AttachFiles, отправка! Потом берём следующего и так до конца списка… Мб в коде будит понятнее with fmDM.ESEND do begin First; fmDM.GMail.AttachFiles.Clear; //очищаем список файлов While not EOF do begin if (FieldbyName(‘STATUS’).AsInteger=0) and (FieldbyName(‘E_MAIL’).AsString») then begin fmDM.GMail.FromEmail:=’mail@gmail.com’; fmDM.GMail.FromName:=’Компания’; fmDM.GMail.Login:=’mail@gmail.com’; fmDM.GMail.Password:=’password’; fmDM.GMail.Recipients.Add(FieldbyName(‘E_MAIL’).AsString); //Добавление аттачей with fmDM.IBATT do begin SQL.Text:=’select * from EATTACH where id_mail= :id’; ParamByName(‘id’).AsInteger:=fmDM.ESEND.FieldByName(‘id_mail’).AsInteger; Open; First; While not EOF do begin fmDM.GMail.AttachFiles.Add(FieldByName(‘PATH’).AsString); Next; end; Close; Transaction.Active:=false; end; ShowMessage(fmDM.GMail.Recipients.Text); ShowMessage(fmDM.GMail.AttachFiles.Text); fmDM.GMail.SendMessage(‘Компания’, true); //… Подробнее »

trackback

[…] написания статьи я решил использовать тему с форума и один из последних комментариев в статье, посвященной использованию Synapse для работы с […]

Geba
Geba
19/03/2015 18:46

Вот только поставил компонент на Delphi 2010. Почту отправляет, но может я чего то недосмотрел или не дочитал, когда я специально ввожу не существующий почтовый адрес, то «сообщение отправляется», а на адрес отправителя приходит сообщение о несуществующем адресе. Хотелось бы перед отправкой сообщения как то проверить наличие существования адресата получателя. Как то так.