Отправка сообщения на E-mail через SMTP — The Delphi

<font>В данной статье рассмотрим методы отправки и приема почты средствами Delphi. Прием и отправку почты реализовать довольно просто, но всё же существует множество подводных камней, поэтому лучше всего читать данную статью внимательно. Для отправки почты нам понадобится компонент idSMTP со страницы IndyClients палитры компонентов Delphi. Данный компонент реализует всё необходимое для отправки электронной почты по протоколу SMTP (Simple Mail Transfer Protocol), обычно он использует 25 порт, но его можно поменять на другой (свойство Port). Так же необходимо произвести настройки формы (размер, цвет и т.д.)</font>

<font><font>Начнем реализовывать наш клиент, для этого разместим на форме idSMTP. Так же произведите настройку внешнего вида формы (название, размер и т.д.). По необходимости можно изменить порт, но главное не стоит забывать, что данный порт должен быть разблокирован в файерволе. Для соединения с SMTP сервером необходимо указать его хост (свойство host). Например: IdSMTP1.Host:= ‘smtp.mail.ru‘; Или (как сделаем мы) разместить на форму Label и Edit. Немного забегая вперед скажу, что соединение с сервером осуществляется методом Connect. </font></font>

<font>            </font>

<font><font>Пример:</font></font>

<?xml:namespace prefix = o ns = «urn:schemas-microsoft-com:office:office» /><o><font> </font></o>

<font><font>procedureConnect(constATimeout: Integer); override;</font></font>

<o><font> </font></o>

<font><font>,где ATimeout — необязательный параметр, задает максимальное время в миллисекундах ожидания ответа с SMTP сервера, по истечении которого попытка установить соединение прекращается. Например: IdSMTP1.Connect(5000);</font></font>

<o><font> </font></o>

<font>Если при соединении с сервером необходима авторизация, то значение свойства AuthenticationType нужно установить в atLogin, при этом в инспекторе объектов также нужно определить свойства Username (имя пользователя). Наример, Username почтового ящика delphi@mail.ru то имя пользователя будет в данном случае Delphi и Password (пароль на ящик), или данное действие можно сделать программно. </font>

<o><font> </font></o>

<font><font>IdSMTP1.AuthenticationType:=atLogin;IdSMTP1.Username:=’delphi’;IdSMTP1.Password:=’password’;<o></font></font>

<o><font> </font></o>

<font><font>Если авторизация не требуется, то свойство AuthenticationType в инспекторе объектов нужно установить в atNone, либо сделать это программно:</font></font>

<o><font> </font></o>

<font><font>IdSMTP1.AuthenticationType:=atNone;</font></font>

<o><font> </font></o>

<font><font>В нашем же примере мы будем считать, что для авторизации нам будет требоваться логии и пароль.<o></font></font>

<font>После применения метода Connect необходимо проверить результат его выполнения. Это делается с помощью свойства Connected, если оно имеет значение true, то подключение прошло нормально. </font>

<font><font>Для отправки сообщений используется функция Send. <o></font></font>

<o><font> </font></o>

<font>Пример:</font>

<o><font> </font></o>

<font>IdSMTP1.Send(Msg);</font>

<o><font> </font></o>

<font>Теперь более подробно рассмотрим структуру письма. Как было уже сказано раньше, метод sendотправляет тело сообщения, представляющего из себя структуру типа TIdMessage. Сама структура письма в Delphiреализуется отдельным компонентов TIdMessage. Он находиться на палитре компонентов Indy Misc. </font>

<o><font> </font></o>

<font>Пример определения TIdMessage структуры:</font>

<o> </o>

<font>varMsg: TIdMessage;beginMsg.Subject:=’тема сообщения’;                  //текст темы сообщенияMsg.Recipients.EMailAddresses:=’bogdanwe@mail.ru’;//указываем адрес получателя Msg.From.Adress:=’delphi@mail.ru’;          //указываем автора письмаMsg.Body.Text:=’текст сообщения’;         //размещаем текст сообщенияMsg.Date:=StrToDate(‘01.12.2004’);//дата отправки письма может быть любойend;   </font>

<o><font> </font></o>

<font>Свойство Subject определяет тему сообщения. Свойство Recipients включает в себя свойство EMailAddresses оно определяет собой адресатов. То есть попросту кому предназначается письмо, разделителем двух и более почтовых адресов служит запятая. </font>

<o><font> </font></o>

<font>Пример:</font>

<o><font> </font></o>

<font>Msg.Recipients.EMailAddresses:=’builder@mail.ru, </font><font>delphi@mail.ru</font><font>’;</font>

<o><font> </font></o>

<font><font>Свойство From представляет из себя объект типа TIdEmailAddressItem в нем содержится информация об отправителя письма. Это свойство включает в себя три свойства: Name, Address, Text. Свойство Address содержитинформацию об электроном ящике отправителя, оно имеет тип String. <o></font></font>

<o><font> </font></o>

<font><font>Пример:</font></font>

<o><font> </font></o>

<font>Msg.From.Address:=’delphi@mail.ru’;</font>

<o><font> </font></o>

<font><font>Свойство nameпредставляет собой имя отправителя, имеет тип String.<o></font></font>

<o><font> </font></o>

<font>Пример:</font>

<o><font> </font></o>

<font>Msg.From.Name:=’Иван Иванович’;</font>

<o><font> </font></o>

<font><font>Свойство Textсодержит себе объединенную информацию этих обоих свойств. Теперь перейдем к телу письма, оно имеет тип TStrings. Теперь же поговорим об присоединение к письму файлов, то есть об аттачменте. Если вам потребовалась прикрепить файл к письму, то необходимо будет создать объект класса TidAttachment. Для этого необходимо будет применить конструктор вида: </font></font>

<o><font> </font></o>

<font>constructor Create(Collection: TIdMessageParts; const AFileName: TFileName = »); reintroduce;</font>

<o><font> </font></o>

<font>, где Collection представляет собой коллекцию приложений к письму, его тип TIdMessageParts. Контстанта AFileName имеющая тип TFileName являеться обычной текстовой строкой. В ней необходимо указать правильный путь к файлу. </font>

<o><font> </font></o>

<font>Пример:</font>

<o><font> </font></o>

<font>TIdAttachment.Create(Msg.MessageParts,’c:file.zip’);</font>

<o><font> </font></o>

<font>После отправки сообщения желательно разорвать связь с сервером, что бы не грузить канал связи. Разрыв связи производиться методом Disconnect.</font>

<o><font> </font></o>

<font>Пример:</font>

<o><font> </font></o>

<font>IdSMTP1.Disconnect;</font>

Просмотров: 3046 | Категория: Delphi 7 | Дата: 24.07.2009

Всем привет. В данном посте посмотрим как отправлять Email через SMTP сервер Яндекса. Для остальных SMTP серверов – можно сделать по аналогии, заменив порты и др. сетевые реквизиты. Яндекс и многие другие почтовики работают через SSL, поэтому нам понадобится дополнительный компонент, который появился только в Indy 10 – TIdSSLIOHandlerSocketOpenSSL1

Итак, для работы – нам понадобится Indy 10 и библиотеки SSL.

Indy10_5303 

Ссылка на официальный сайт  Indy, где можно скачать саму Indy и SSL библиотеки

Есть программа Win32OpenSSL – она устанавливает библиотеки в каталоги Windows.

Как узнать свою версию Indy?

Положите на форму любой компонент Indy, например, IdSMTP и напишите следующий код, например, на кнопке…

Как установить Indy (если необходимо)?

Перед установкой необходимо удалить предыдущую версию Indy. Для этого идем по меню Component-Install Packages и удалем все со словом Indy. Следующим шагом распаковываем архив скачанный с сайта Indy Теперь необходимо добавить пути Library path. Для этого переходим по пункту Tools-Environment Options-Library и добавляем Library path пути к следующим папкам

  1. System
  2. Core
  3. Protocols
  4. Super Core

Теперь открываем и компилируем пакеты в следующем порядке:

  1. пакет IndySystemX0.dpk (где X – это версия Delphi) (папка System)
  2. пакет IndyCoreX0.dpk (где X- это версия Delphi) (папка Core)
  3. пакет IndyProtocolsX0.dpk (где X – это ваша версия Delphi) (папка Protocols).
  4. пакет IndySuperCore70.dpk  (для Delphi 7) (папка Super Core)

Далее открываем и устанавливаем:

  1. пакет dclIndyCoreX0.dpk (папка Core)
  2. пакет dclIndySuperCore70.dpk   (папка Super Core) только для Delphi 7
  3. пакет dclIndyProtocolsX0.dpk (папка Protocols)

Установка Indy завершена.

Где разместить DLL?

В принципе, здесь стандартно, об этом я уже писал в статье про DLL

-В каталоге из которого запускается программа

-В каталоге Windows

-В системном каталоге Windows

-В каталогах, включенных в переменную окружения PATH

Если Вы используете Win32OpenSSl, тогда инсталлятор положит все куда нужно самостоятельно.

Какие версии библиотеки использовать?

Я пробовал с разными, работало не со всеми. На момент написания статьи последней версией библиотеки SSL была

openssl-1.0.2p-i386-win32

openssl-1.0.2p-i386-win32openssl-1.0.2p-x64_86-win64

Здесь все компоненты создаются и удаляются динамически. Я тестил на Яндекс ящике. В принципе, для других ящиков – просто поменяйте порт, если нужно, ну и логин с паролем.

Комментарий {SMTP.UserName должно совпадать с msg.From.Address, иначе Яндекс забъет тревогу))) }

Ещё один код со StackOverFlow

Блог программиста-самоучки

Ветка форума Cyber-Forum

Блог Random Thoughts…

Win32OpenSSL

Отправка сообщения на E-mail через SMTP
  1. Компонент IdSMTP из вкладки Indy Clients;
  2. Компонент IdMessage из вкладки Indy Misc;
  3. Компонент IdEncoderMIME1 из вкладки Indy Misc;
  4. Компонент Button из вкладки Standart.

<center>form-smtp.pngForm</center> После строки {$R *.dfm} пишем код. Комментарии внутри.

 {$R *.dfm}  //Функция конвертирования в кодировку windows-1251 function ConvertToWIN1251(instr:string):string; begin   result:='=?'+'Windows-1251'+'?B?'+form1.IdEncoderMIME1.Encode(instr)+'?='; end;  procedure TForm1.Button1Click(Sender: TObject); var attach: TidAttachment; begin    IdSMTP1.AuthenticationType:= atLogin;   IdSMTP1.Username:='user@mail.ru'; //Логин   IdSMTP1.Password:='password'; //Пароль   IdSMTP1.Host:='smtp.mail.ru'; //Хост    //Хосты: smtp.inbox.ru; smtp.list.ru; smtp.bk.ru; smtp.yandex.ru и т.д.   IdSMTP1.Port:=25; //Порт (25 - по умолчанию)   //Порты mail.ru: 587 и 2525 (без шифрования) или 465 (с шифрованием)    IdMessage1.CharSet:='windows-1251'; //Кодировка в теле сообщения   IdMessage1.ContentType:='text/plain';   // или    //IdMessage1.ContentType:='text/html';    //если в теле сообщения будет присутствовать HTML код   IdMessage1.Body.text:='Текст'; //Текст сообщения   IdMessage1.Subject:=ConvertToWIN1251('Тема'); //Тема сообщения   IdMessage1.From.Address:='user@mail.ru'; //Адрес отправителя   //IdMessage1.From.Name:=ConvertToWIN1251('User'); //Имя отправителя   IdMessage1.Recipients.EMailAddresses:='send_user@mail.ru'; //Кому отправить письмо (можно через запятую если несколько e-mail'ов)   IdMessage1.IsEncoded:=true;   //attach:=TIdAttachment.Create(IdMessage1.MessageParts,'Путь до файла'); //Вложение    try     //Соединение с почтовым сервером     IdSMTP1.Connect();     IdSMTP1.Send(IdMessage1);     showmessage('Сообщение отправлено');   except     showmessage('Ошибка при отправке сообщения');   end; //Отсоединяемся от почтового сервера IdSMTP1.Disconnect; end; 

Вот и всё, Удачи! Зарегистрируйтесь или авторизуйтесь, чтобы скачать.

Источник: www.thedelphi.ruАвтор: Савельев АлександрОпубликовано: 27 Апреля 2012Просмотров: 42637

<center>Зарегистрируйтесь или авторизуйтесь, чтобы добавлять комментарии.<center>

<alt src=»http://thedelphi.ru/avatars/1353123101.jpg»> Добавил: <font>oktavius</font> [Новичок] Дата: 2012-11-21
БРАВО!)

<center>

<alt src=»http://thedelphi.ru/avatars/net-avatara.jpg»> Добавил(а): <font>AndHacker</font> [Новичок] Дата: 2014-11-02
Этот пример, сейчас, точно работает?

<center>

<alt src=»http://thedelphi.ru/avatars/net-avatara.jpg»> Добавил(а): <font>Lomanu4</font> [Новичок] Дата: 2014-11-22
У меня пишет вот такую ахинею вызвал исключение класса eidprotocolreplyerror с сообщением Smtp is available only with SSL or TLS connection enable

</center></center></center></center>

Ссылка на основную публикацию