В качестве небольшого бонуса своим читателям, которые заинтересовались работой с почтой GMail из Delphi, написал небольшой компонент для отправки писем через аккаунт GMail. В принципе, сам по себе этот компонент может использоваться для работы и с другими smtp-серверами, например, с mail.ru, но обо всем по порядку.
Во-первых, сразу предупреждаю, что для работы компонента необходимо иметь под рукой библиотеку Synapse. Так уж сложилось, что с ней мне работать намного удобнее, чем с Indy.
Во-вторых, скачать компонент, а также его исходники Вы можете со страницы нашего общего проекта на .
Теперь, непосредственно по работе с компонентом. У компонента 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
Думаю, что бесполезно искать работу в Интернет, если не учитывать при поиске регион. Поэтому для тех, кто ищет работу могу посоветовать вакансии в Перми, а также вакансии в Запорожье. Кстати, на slando.ru есть не только предложения о работе в различных регионах - это в первую очередь огромный портал частных объявлений. Так что заходите, изучайте, оставляйте свои предложения и...ищите работу :)
---------------------------
| Делись! | Загружай! | Плюсуй! |
| | |









16 Апр 2010 в 10:09 пп
Хорошо бы ещё указать, чем это отличается от стандартного компонента SMTP.
17 Апр 2010 в 12: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 Апр 2010 в 12:53 дп
Так… с mail.ru проблема была на моей стороне)
А с gmail.com всё равно не отправляет(
17 Апр 2010 в 12:09 пп
на gmail.com логин к smtp как записываете? c @gmail.com? Порт 587? Проверил работу на 2-х разных ящиках gmail — все отправляется без проблем.
17 Апр 2010 в 12:16 пп
Да практически ни чем :) Просто использует пару модулей Synapse. Был где-то вопрос по поводу smtp не то в почте не то в блоге — как установить для заголовка письма одну кодировку, а для тела — другую. Хз зачем это надо, но ради интереса добавлю в компонент эту возможность
19 Апр 2010 в 11:26 дп
Стилистические замечания к коду в GMailSMTP.pas:
property GMessage:TMimeMess read FMsg write FMsg;
property MIMEPart:TMimePart read FMIMEPart write FMIMEPart;
совсем не понимаю, зачем в описании свойств указана write-часть? имхо, такие свойства обычно делаются read-only, чтобы не дать возможность пользователям переписать переменную и допустить утечку памяти!
21 Апр 2010 в 9:43 дп
Gmail исползует ssl шифрование
21 Апр 2010 в 11:33 дп
поэтому и прицепляем в проект модуль ssl_openssl, а в Indy dll-ки храним с проектом :)
08 Июл 2010 в 8:26 пп
а на gmail не отправляет потому что в компоненте запускается функция smtpsend.SendToRaw в которой по умолчанию закомментированы
SMTP.AutoTLS := True; и //SMTP.FullSSL := True;
а gmail требует или ту или другую в зависимости от порта (465 или 587).
16 Июл 2010 в 8:42 пп
У меня никак не хочет отправляться, SendToRaw всегда вовзращает False. Менять AutoTLS и FullSSL пробовал.
16 Июл 2010 в 10:18 пп
Keeper, то что тут написано смотрел? Модуль модуль ssl_openssl подключен? протокол POP3 включен в настройках? Порт указан 495? Проверил у себя уже раз 100 — отправляется все :) Глянь в настройках gmail — мож чего забыл включить.
Да и ещё один момент — если пароль содержит спецсимволы, то можно попробовать его передать его в параметры в закодированном виде, т.е. как-то так
EncodeURL(password)16 Июл 2010 в 10:33 пп
Смотрел.
ssl_openssl есть, есть POP3, спец. символов в пароле нет. POP3 включается странно: ставлю 1 или второй радиобаттон, жму сохранить, а в настройках по-прежнему ничего не выделено, но написано » Состояние: POP включен для всех писем, полученных с 13 июля.».
Порт указываю 587 (так рекомендовано в настройках + telnet соединяется по нему, по 495 не хочет).
16 Июл 2010 в 10:36 пп
Код:
...
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;
16 Июл 2010 в 11:22 пп
Ок, Keeper, сегодня уже врядли чего путнего скажу, т.к. у меня время позднее — спать пора, горшок звенит и всё такое :) Завтра первым делом разберусь с gmail. Если получиться слишком много объеснений — запостю пост, а так — откомментируюсь тута.
16 Июл 2010 в 11:36 пп
Ок, спасибо )
17 Июл 2010 в 4:23 пп
Начал разбираться со gmail ещё раз. Обнаружил на тестовом акке следующую проблему — Synapse вупор не хочет выполнять SSLC0nnect — выдает ошибку 10091. Подозреваю, что проблема с Синапсом…Буду разбираться дальше
19 Июл 2010 в 1:28 пп
Пока не поставил Microsoft Visual C++ Runtime Library
почта «тихо» не уходила…Ошибок не выдавала.
27 Окт 2011 в 9:09 пп
Добрый день, пробую ваш компонент, все работает. Решил добавить ProgressBar чтобы видеть как идет закачивание на сервер.
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;
Размер письма по этому методу получается больше где-то в полтора раза больше размера вложений.
Я прекрасно понимаю, что это нормально и что это и служебные запросы и сам формат письма для smtp перекодируется. Из-за этого растет размер. Вопрос же в следующем, как можно адекватно узнать размер отправляемого письма? Ведь по спецификации, как я понимаю, посылается вначале запрос типа MAIL FROM:<ned@innosoft.com> SIZE=500000? для того чтобы при отправке обновлять свойство max у Progressbar.
Заранее спасибо за помощь!