Сегодня решил немного поэкспериментировать с библиотекой Synapse и научиться отправлять письма, используя протокол SMTP (Simple Mail Transfer Protocol – протокол передачи почты). Тема эта достаточно интересная и полезная. Дело даже не в том, чтобы написать для себя почтовый клиент, коих миллионы. Подобные навыки работы с бибилиотекой могут потребоваться, например, если Вы захотитенаписать своего клиента для отправки сообщений в свой блог на ЖЖ, Blogger или LiveInternet – эти блог сервисы поддерживают публикацию новых постов по e-mail. Так что, полученные сегодня навыки несомнено должы принести Вам (мне точно) определенную пользу.
'
'
Для работы с протоколом SMTP в Synapse можно использовать следующие модули биюлиотеки:
- smtpsend – содержит объект Tsmtpsend и ключевые методы для отправки электронных писем.
- mimemess – содержит объекты TMessHeader – заголовки сообщения; TMimeMess – сообщение;
- mimepart – содержит объект TMimePart для работы с частями сообщения, которые можно использовать для отправки по почте файлов.
Сегодня сосредоточимся на основной задаче – отправке текста. Так как именно для этого в свое время и был создан SMTP, а пересылкой файлов (аттачей) занимается не протокол, а расширение к протоколу - MIME (Multupurpose Internet Mail Extentions, RFC-1521). Расширениями займемся позднее.
Итак, сегодня в наши задачи входит:
- Составить правильный заголовок сообщения
- Добавить в сообщение текст (plain text) или html-код
- Оправить сообщение на постовый ящик, используя заданый 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
Итак, в заголовки сообщения нам необходимо включить:
- Имя отправителя
- Адрес отправителя
- Список получателей (в нашем случае получатель будет один)
Подключаем к проекту модули 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:










28 Feb 2010 в 1:44 am
Спасибо за интересную статью. Не подскажешь как реализовать отправку файла на мыло?
28 Feb 2010 в 9:19 am
Чтоб отправить файл на мыло надо использовать TMimePart и его метод AddPartBinary. Прицпляешь сначало текст, потом файлик и также само отправляешь.
17 Mar 2010 в 6:07 pm
Так же было интересно прочитать статью про отправку писем через SMTP сервер использующий SSL (gmail, yhoo, msn)
17 Mar 2010 в 6:38 pm
Надо посмотреть. Вроде бы с Synapse все должно сработать быстро, главно не забыть подцепить модуль ssl_openssl :)
23 Mar 2010 в 5:05 am
А как проверить корректность отправки почты? Ошибка не выдаётся даже тогда, когда нет подключения к SMTP-серверу.
23 Mar 2010 в 3:56 pm
Странно…у меня при невозможности соединения с сервером исключение возникает, да и другие исключения обрабатывает. Может у Вас в IDE стоит пропуск каких-нибудь исключений?
23 Mar 2010 в 4:31 pm
А я-то как удивился! Я в Ubuntu использую Lazarus. Попробую в Windows ещё поковыряться Lazarus.
24 Mar 2010 в 5:40 pm
И у меня такая же ерундень. Стоит Delphi 7 с стандартными настройками. Никаких обибок или сообщений не выдает. Наверное надо самому как-то проверять все события или читать их статус. Кстати, то что письмо не отправилось можно проверить посмотрев на то, что вернула функция Send Сам не пробовал, но должно работать.
05 Apr 2010 в 3:17 pm
меня интересует как у From и To установить кодировку?
Msg.Header.Subject := Subject;//тема сообщения
Msg.Header.From := From; //имя и адрес отправителя
Msg.Header.ToList.Add(pTo); //имя и адрес получателя
05 Jun 2010 в 7:05 am
у меня это вообще не работает, пишу под xp библиотеку от сюда взял http://www.koders.com/info.aspx?c=ProjectInfo&pid=DEQAQ82QTXZZNDY4RT2N9NNSRB как не отправляю ничего не доходит, логин пытался и с @mail.ru и без него, не робит никак, код от сюда скопирован, не пойму в чем моя ошибка, можете что нибуть подсказать?