Подписка

Проекты

Сборник идей для разработок в Delphi и использования их в Интернет. Участвуй в работе коллективного разума!

Google API в Delphi - проект с открытым исходным кодом.


А тут я коплю на лицензию Delphi 2011. Сумма пожертвования не фиксирована.

Друзья блога

Блоги и сообщества

DelphiFeeds.ru - Все Delphi-блоги Рунета О раскрутке блога по программированию Сообщество умных людей VR-Online.RU Бесплатный журнал для программистов и всех, кто интересуется IT Статьи и уроки по Delphi Статьи по Delphi

Счётчики


Анализ веб сайтов

Рейтинг блогов




Система Orphus

  • 22Feb

    Сегодня решил немного поэкспериментировать с библиотекой Synapse и научиться отправлять письма, используя протокол SMTP (Simple Mail Transfer Protocol – протокол передачи почты). Тема эта достаточно интересная и полезная. Дело даже не в том, чтобы написать для себя почтовый клиент, коих миллионы. Подобные навыки работы с бибилиотекой могут потребоваться, например, если Вы захотитенаписать своего клиента для отправки сообщений в свой блог на ЖЖ, Blogger или LiveInternet – эти блог сервисы поддерживают публикацию новых постов по e-mail. Так что, полученные сегодня навыки несомнено должы принести Вам (мне точно) определенную пользу. ' ' Для работы с протоколом SMTP в Synapse можно использовать следующие модули биюлиотеки:

    1. smtpsend – содержит объект Tsmtpsend и ключевые методы для отправки электронных писем.
    2. mimemess – содержит объекты TMessHeader – заголовки сообщения; TMimeMess – сообщение;
    3. mimepart – содержит объект TMimePart для работы с частями сообщения, которые можно использовать для отправки по почте файлов.

    Сегодня сосредоточимся на основной задаче – отправке текста. Так как именно для этого в свое время и был создан SMTP, а пересылкой файлов (аттачей) занимается не протокол, а расширение к протоколу -  MIME (Multupurpose Internet Mail Extentions, RFC-1521). Расширениями займемся позднее.

    Итак, сегодня в наши задачи входит:

    1. Составить правильный заголовок сообщения
    2. Добавить в сообщение текст (plain text) или html-код
    3. Оправить сообщение на постовый ящик, используя заданый smtp-сервер.

    1. Подготавливаемся к работе с SMTP в Delphi. Загоовка приложения.

    Открываем Delphi, создаем новое приложение и на главной форме размещаем компоненты как показано на рисунке:

    Как вы знаете, SMTP-серверы почтовых служб таких как mail.ru требуют обязательной авторизации, поэтому на форме нашего будущего приложения предусмотрены два поля: “Логин пользователя” и “Пароль пользователя” – туда будем записывать данные для авторизации на SMTP-сервере.

    Поле “Хост” должно содержать хост smtp-сервера, например, smtp.mail.ru или smtp.yandex.ru и т.д., смотря от чьего имени вы будете слать письма. Поле “Адрес e-mail” для отправителя должен содержать правильный адрес, т.е. применительно к mal.ru, если ваш логин “blogger”, то ящик должен быть “blogger@mail.ru”, а хост “smtp.mail.ru”.

    С формой приложения и назначением элементов главной формы, думаю, разобрались. Переходим ко второму пункту нашей работы – создадим правильное сообщение.

    2. Формируем сообщение e-mail, используя Synapse

    Итак, в заголовки сообщения нам необходимо включить:

    1. Имя отправителя
    2. Адрес отправителя
    3. Список получателей (в нашем случае получатель будет один)

    Подключаем к проекту модули mimemess, mimepart, smtpsend.  Создаем процедуру с названием, например SendMail:

    Procedure SendMail (Host, Subject, pTo, From , TextBody, HTMLBody, login,password : string);
    var Msg : TMimeMess; //собщение
        StringList : TStringList; //содержимое письма
        MIMEPart : TMimePart; //части сообщения (на будущее)
    begin
      Msg := TMimeMess.Create; //создаем новое сообщение
      StringList := TStringList.Create;
      try
    // Добавляем заголовки
        Msg.Header.Subject := Subject;//тема сообщения
        Msg.Header.From := From; //имя и адрес отправителя
        Msg.Header.ToList.Add(pTo); //имя и адрес получателя
    // создаем корневой элемент
        MIMEPart := Msg.AddPartMultipart('alternative', nil);
        if length(TextBody)>0 then
          begin
            StringList.Text := TextBody;
            Msg.AddPartText(StringList, MIMEPart);
          end
        else
          begin
            StringList.Text := HTMLBody;
            Msg.AddPartHTML(StringList, MIMEPart);
          end;
    // Кодируем и отправляем
        Msg.EncodeMessage;
        smtpsend.SendToRaw(From, pTo, Host, Msg.Lines, login, password);
     finally
       Msg.Free;
       StringList.Free;
     end;
    end;

    Разберем по частям, что к чему. В начале создаем новое сообщение, используя объект TMimeMess (сообщение) из модуля Synapse mimemess.

    Далее добавляем в сообщение все необходимые заголовки. Создаем объект TMimePart. Так как создается корневой элемент MIME, то вторым параметром, согласно условиям работы с Synapse, ставится nil. Если мы отправляем простой текст, то используем метод AddPartText, где вторым параметром выступает как раз созданные нами корневой элемент, иначе, если текстовое содержимое не отсылается, то принимаем, что отсылается HTML-код и используем соответственно метод AddPartHTML. Также Вы можете добавить в сообщение:

    • Текст из файла, используя метод AddPartTextFromFile.
    • HTML-код из файла, используя метод AddPartHTMLFromFile
    • Бинарный файл, загрузив данные в поток TStream и указав его в параметрах метода AddPartBinary

    Есть ещё ряд других методов, расширяющих возможности объекта TMimePart, разобраться с работой которых, думаю, будет достаточно просто.

    После того, как сообщение собрано, мы его кодируем, используя метод EncodeMessage, в котором собираются правильные, согласно RFC заголовки, “склеиваются” все части  и т.д. И, наконец, отправляется письмо, используя метод SendToRaw из модуля Synapse httpsend.

    Теперь, когда основная процедура отправки готова. Дописываем приложение.

    3. Дорабатываем приложение для отправки почты.

    В обработчике onClick кнопки пишем:

    procedure TForm5.Button1Click(Sender: TObject);
    begin
    if RadioButton1.Checked then
      SendMail(Edit1.Text,
        'Test Message',
        '"' + Edit4.Text + '" <' + Edit5.Text + '>',
        '"' + Edit2.Text + '" <' + Edit3.Text + '>',
        Memo1.Text,
        '',
        Edit6.Text, Edit7.text)
    else
      SendMail(Edit1.Text,
        'Test Message',
        '"' + Edit4.Text + '" <' + Edit5.Text + '>',
        '"' + Edit2.Text + '" <' + Edit3.Text + '>',
        '',
        Memo1.Text,
        Edit6.Text, Edit7.text)
    end;

    Теперь можете проверить работу приложения. Например я отправил себе на второй ящик письмо:

    И спустя буквально пару секунд получил новое письмо на свой ящик:

    Теперь можете потренироваться с приложением, добавить возможность отправки файлов по электронной почте и т.д. Как видите, с Synapse не только просто работать с HTTP и HTTPS-протоколами, но и не менее просто отправлять электронную почту.

    -----------------------------
    Интересуетесь технологиями Apple? Тогда apple блог, блог по apple, советы apple - это для Вас. Изучайте, участвуйте в обсуждениях, получайте последние новости по RSS.

    Если Вы готовитесь к свадьбе, то к вашим услугам салоны свадебных платьев, где Вы сможете купить свадебное платье Одесса, пошить свадебные платья и даже закупиться платьями оптом :)
    -----------------------------

    Related posts:

    1. Synapse. Авторизация на сайте. Работа с HTTPS.

    Автор Vlad в 6:24 pm

    Метки: ,

10 Comments

WP_Cloudy
  • ManGysITI пишет:

    Спасибо за интересную статью. Не подскажешь как реализовать отправку файла на мыло?

  • Vlad пишет:

    Чтоб отправить файл на мыло надо использовать TMimePart и его метод AddPartBinary. Прицпляешь сначало текст, потом файлик и также само отправляешь.

  • Станислав пишет:

    Так же было интересно прочитать статью про отправку писем через SMTP сервер использующий SSL (gmail, yhoo, msn)

  • Vlad пишет:

    Надо посмотреть. Вроде бы с Synapse все должно сработать быстро, главно не забыть подцепить модуль ssl_openssl :)

  • Slayer пишет:

    А как проверить корректность отправки почты? Ошибка не выдаётся даже тогда, когда нет подключения к SMTP-серверу.

  • Vlad пишет:

    Странно…у меня при невозможности соединения с сервером исключение возникает, да и другие исключения обрабатывает. Может у Вас в IDE стоит пропуск каких-нибудь исключений?

  • Андрей пишет:

    А я-то как удивился! Я в Ubuntu использую Lazarus. Попробую в Windows ещё поковыряться Lazarus.

  • Станислав пишет:

    И у меня такая же ерундень. Стоит Delphi 7 с стандартными настройками. Никаких обибок или сообщений не выдает. Наверное надо самому как-то проверять все события или читать их статус. Кстати, то что письмо не отправилось можно проверить посмотрев на то, что вернула функция Send Сам не пробовал, но должно работать.

  • Евгений пишет:

    меня интересует как у From и To установить кодировку?

    Msg.Header.Subject := Subject;//тема сообщения
    Msg.Header.From := From; //имя и адрес отправителя
    Msg.Header.ToList.Add(pTo); //имя и адрес получателя

  • Жека пишет:

    у меня это вообще не работает, пишу под xp библиотеку от сюда взял http://www.koders.com/info.aspx?c=ProjectInfo&pid=DEQAQ82QTXZZNDY4RT2N9NNSRB как не отправляю ничего не доходит, логин пытался и с @mail.ru и без него, не робит никак, код от сюда скопирован, не пойму в чем моя ошибка, можете что нибуть подсказать?

Ваш ответ

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

Пожалуйста, заключайте исходный код в тэги [code][/code].