Подписка

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

Наши проекты

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 16 апреля 2010 в 19:20.
Категории: Delphi в Web.


В качестве небольшого бонуса своим читателям, которые заинтересовались работой с почтой 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

---------------------------
Думаю, что бесполезно искать работу в Интернет, если не учитывать при поиске регион. Поэтому для тех, кто ищет работу могу посоветовать вакансии в Перми, а также вакансии в Запорожье. Кстати, на slando.ru есть не только предложения о работе в различных регионах - это в первую очередь огромный портал частных объявлений. Так что заходите, изучайте, оставляйте свои предложения и...ищите работу :)
---------------------------
Понравилась статья? Тогда:
Делись! Загружай! Плюсуй!
   Отправить PDF на   
Читай ещё статьи на WebDelphi.ru

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

WP_Cloudy
  • Александр пишет:

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

  • Роман пишет:

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

  • Роман пишет:

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

  • Vlad пишет:

    на gmail.com логин к smtp как записываете? c @gmail.com? Порт 587? Проверил работу на 2-х разных ящиках gmail — все отправляется без проблем.

  • Vlad пишет:

    Да практически ни чем :) Просто использует пару модулей Synapse. Был где-то вопрос по поводу smtp не то в почте не то в блоге — как установить для заголовка письма одну кодировку, а для тела — другую. Хз зачем это надо, но ради интереса добавлю в компонент эту возможность

  • deksden пишет:

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

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

  • Алексей (Минск) пишет:

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

  • Vlad пишет:

    поэтому и прицепляем в проект модуль ssl_openssl, а в Indy dll-ки храним с проектом :)

  • Bazar пишет:

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

  • Keeper пишет:

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

  • Vlad пишет:

    Keeper, то что тут написано смотрел? Модуль модуль ssl_openssl подключен? протокол POP3 включен в настройках? Порт указан 495? Проверил у себя уже раз 100 — отправляется все :) Глянь в настройках gmail — мож чего забыл включить.
    Да и ещё один момент — если пароль содержит спецсимволы, то можно попробовать его передать его в параметры в закодированном виде, т.е. как-то так
    EncodeURL(password)

  • Keeper пишет:

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

  • Keeper пишет:

    Код:


    ...
    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;
  • Vlad пишет:

    Ок, Keeper, сегодня уже врядли чего путнего скажу, т.к. у меня время позднее — спать пора, горшок звенит и всё такое :) Завтра первым делом разберусь с gmail. Если получиться слишком много объеснений — запостю пост, а так — откомментируюсь тута.

  • Keeper пишет:

    Ок, спасибо )

  • Vlad пишет:

    Начал разбираться со gmail ещё раз. Обнаружил на тестовом акке следующую проблему — Synapse вупор не хочет выполнять SSLC0nnect — выдает ошибку 10091. Подозреваю, что проблема с Синапсом…Буду разбираться дальше

  • Юрий пишет:

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

  • zvyagaaa пишет:

    Добрый день, пробую ваш компонент, все работает. Решил добавить 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.
    Заранее спасибо за помощь!  
     

Ваш ответ

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

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

   


с услугой шкафы купе киев можно сэкономить 400 грн --|--. машина моечная мм 4