Всем привет. В данном посте посмотрим как отправлять Email через SMTP сервер Яндекса. Для остальных SMTP серверов – можно сделать по аналогии, заменив порты и др. сетевые реквизиты. Яндекс и многие другие почтовики работают через SSL, поэтому нам понадобится дополнительный компонент, который появился только в Indy 10 – TIdSSLIOHandlerSocketOpenSSL1
Подготовительная работа
Итак, для работы – нам понадобится Indy 10 и библиотеки SSL.
Ссылка на официальный сайт Indy, где можно скачать саму Indy и SSL библиотеки
Есть программа Win32OpenSSL – она устанавливает библиотеки в каталоги Windows.
Как узнать свою версию Indy?
Положите на форму любой компонент Indy, например, IdSMTP и напишите следующий код, например, на кнопке…
1 |
ShowMessage('Indy version: ' + IdSMTP1.Version); |
Я свою версию Indy не менял, у меня та, что поставлялась с Delphi XE7 10.6.0.5169
Как установить Indy (если необходимо)?
Перед установкой необходимо удалить предыдущую версию Indy. Для этого идем по меню Component-Install Packages и удалем все со словом Indy.
Следующим шагом распаковываем архив скачанный с сайта Indy
Теперь необходимо добавить пути Library path. Для этого переходим по пункту Tools-Environment Options-Library и добавляем Library path пути к следующим папкам
- System
- Core
- Protocols
- Super Core
Теперь открываем и компилируем пакеты в следующем порядке:
- пакет IndySystemX0.dpk (где X – это версия Delphi) (папка System)
- пакет IndyCoreX0.dpk (где X- это версия Delphi) (папка Core)
- пакет IndyProtocolsX0.dpk (где X – это ваша версия Delphi) (папка Protocols).
- пакет IndySuperCore70.dpk (для Delphi 7) (папка Super Core)
Далее открываем и устанавливаем:
- пакет dclIndyCoreX0.dpk (папка Core)
- пакет dclIndySuperCore70.dpk (папка Super Core) только для Delphi 7
- пакет dclIndyProtocolsX0.dpk (папка Protocols)
Установка Indy завершена.
Где разместить DLL?
В принципе, здесь стандартно, об этом я уже писал в статье про DLL
-В каталоге из которого запускается программа
-В каталоге Windows
-В системном каталоге Windows
-В каталогах, включенных в переменную окружения PATH
Если Вы используете Win32OpenSSl, тогда инсталлятор положит все куда нужно самостоятельно.
Какие версии библиотеки использовать?
Я пробовал с разными, работало не со всеми. На момент написания статьи последней версией библиотеки SSL была
openssl-1.0.2p-i386-win32openssl-1.0.2p-x64_86-win64
Собственно код для отправки E-mail
Здесь все компоненты создаются и удаляются динамически. Я тестил на Яндекс ящике. В принципе, для других ящиков – просто поменяйте порт, если нужно, ну и логин с паролем.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
procedure TForm1.Button6Click(Sender: TObject); var SMTP : TIdSMTP; msg : TIdMessage; SSLOpen : TIdSSLIOHandlerSocketOpenSSL; begin SMTP := TIdSMTP.Create(Application); SMTP.Host := 'smtp.yandex.ru'; SMTP.Port := 465; SMTP.AuthType := satDefault; SMTP.Username := 'yourlogin@yandex.ru';{Должно совпадать с msg.From.Address} SMTP.Password := 'yourpassword'; //это необходимо использовать для SSL SSLOpen := TIdSSLIOHandlerSocketOpenSSL.Create(nil); SSLOpen.Destination := SMTP.Host+':'+IntToStr(SMTP.Port); SSLOpen.Host := SMTP.Host; SSLOpen.Port := SMTP.Port; SSLOpen.DefaultPort := 0; SSLOpen.SSLOptions.Method := sslvSSLv23; SSLOpen.SSLOptions.Mode := sslmUnassigned; SMTP.IOHandler := SSLOpen; SMTP.UseTLS := utUseImplicitTLS; msg := TIdMessage.Create(Application); msg.ContentType:='text/html; charset=windows-1251'; msg.Body.Text:='Привет из Delphi'; msg.Subject := 'Проверка почты'; msg.From.Address := 'yourlogin@yandex.ru'; {<<Должно совпадать с SMTP.UserName} msg.From.Name := 'YourName'; msg.Recipients.EMailAddresses :='RecipientLogin@gmail.com'; SMTP.Connect; if SMTP.Connected then begin SMTP.Send(msg); ShowMessage ('Сообщение отправлено'); end else ShowMessage ('Не удалось отправить сообщение'); SMTP.Disconnect(); SMTP.Free; msg.Free; end; |
Комментарий
{SMTP.UserName должно совпадать с msg.From.Address, иначе Яндекс забъет тревогу))) }
Ещё один код со StackOverFlow
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdExplicitTLSClientServerBase, IdMessageClient, IdSMTPBase, IdMessage, IdSMTP, IdIOHandler, IdIOHandlerSocket, IdIOHandlerStack, IdSSL, IdSSLOpenSSL, IdText; procedure TForm1.Button1Click(Sender: TObject); var // variáveis e objetos necessários para o envio IdSSLIOHandlerSocket: TIdSSLIOHandlerSocketOpenSSL; IdSMTP: TIdSMTP; IdMessage: TIdMessage; IdText: TIdText; sAnexo: string; begin // instanciação dos objetos IdSSLIOHandlerSocket := TIdSSLIOHandlerSocketOpenSSL.Create(Self); IdSMTP := TIdSMTP.Create(Self); IdMessage := TIdMessage.Create(Self); try // Configuração do protocolo SSL (TIdSSLIOHandlerSocketOpenSSL) IdSSLIOHandlerSocket.SSLOptions.Method := sslvSSLv23; IdSSLIOHandlerSocket.SSLOptions.Mode := sslmClient; // Configuração do servidor SMTP (TIdSMTP) IdSMTP.IOHandler := IdSSLIOHandlerSocket; IdSMTP.UseTLS := utUseImplicitTLS; IdSMTP.AuthType := satDefault; IdSMTP.Port := 465; IdSMTP.Host := 'smtp.gmail.com'; IdSMTP.Username := 'MYLOGIN@gmail.com'; IdSMTP.Password := 'MYPASS'; // Configuração da mensagem (TIdMessage) IdMessage.From.Address := 'MYLOGIN@gmail.com'; IdMessage.From.Name := 'John Smith'; IdMessage.ReplyTo.EMailAddresses := IdMessage.From.Address; IdMessage.Recipients.Add.Text := 'receiver@example.com'; IdMessage.Subject := 'Hello World'; IdMessage.Encoding := meMIME; // Configuração do corpo do email (TIdText) IdText := TIdText.Create(IdMessage.MessageParts); IdText.Body.Add('The body of the e-mail goes here'); IdText.ContentType := 'text/plain; charset=iso-8859-1'; // Conexão e autenticação try IdSMTP.Connect; IdSMTP.Authenticate; except on E:Exception do begin MessageDlg('Cannot authenticate: ' + E.Message, mtWarning, [mbOK], 0); Exit; end; end; // Envio da mensagem try IdSMTP.Send(IdMessage); MessageDlg('Message sent successfully!', mtInformation, [mbOK], 0); except On E:Exception do begin MessageDlg('Error while sending a message: ' + E.Message, mtWarning, [mbOK], 0); end; end; finally // liberação dos objetos da memória FreeAndNil(IdMessage); FreeAndNil(IdSSLIOHandlerSocket); FreeAndNil(IdSMTP); end; end; |