10 апреля 2010 г.

Отправка почты с SSL шифрование (Indy 10 + Open SSL)

Такие почтовые сервера как Google, Yahoo или MSN требуют при авторизации на своих SMTP серверах  использовать шифрование SSL.
В данном посте я расскажу как отправлять почту из программ написанных на Delphi используя шифрование SSL.
Нам понадобится:
  • Indy версии 10, поскольку в нем добавлена возможность использования Open SSL (9 версия не подойдет). Я использовал версию 10.0.52 (взять можно тут)
  • Пакет Open SSL, у меня стабильно заработал с версией 0.9.8h

Устанавливаем Indy 10.

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


Установка Open SSL.

Установка  Open SSL не требуется. Все что необходимо, распаковать DLL библиотеки в каталог с проектом.


Собственно отправка почты.

Кидаем на форму следующие компоненты:
idMessage, idSMTP, IdSSLIOHandlerSocketOpenSSL

Теперь пишем вот такой код:
{формируем тело сообщения}
IdMessage1 := TIdMessage.Create;
IdMessage1.From.Address := Fromadres.Text;
IdMessage1.Recipients.EMailAddresses := Toadres.Text;
IdMessage1.Subject := UTF8Encode(subject.Text);
IdMessage1.Date:= now;

{настройка компонентов перед отправкой}
IdSMTP := TIdSMTP.Create(nil);

IdSMTP.Host:=ed_smtpserver.Text;
IdSMTP.Port:=ed_port.text; // обычно при использование ssl 495, 587 или стандартный 25
IdSMTP.Username:=login.Text;
IdSMTP.Password:=ed_.pass.Text;
IdSMTP.AuthType:=atDefault;

{это необходимо использовать для SSL}
IdSSLIOHandlerSocketOpenSSL := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
IdSSLIOHandlerSocketOpenSSL.Destination := IdSMTP.Host+':'+IntToStr(IdSMTP.Port);
IdSSLIOHandlerSocketOpenSSL.Host := IdSMTP.Host;
IdSSLIOHandlerSocketOpenSSL.Port := IdSMTP.Port;
IdSSLIOHandlerSocketOpenSSL.DefaultPort := 0;
IdSSLIOHandlerSocketOpenSSL.SSLOptions.Method := sslvTLSv1;
IdSSLIOHandlerSocketOpenSSL.SSLOptions.Mode := sslmUnassigned;

IdSMTP.IOHandler := IdSSLIOHandlerSocketOpenSSL;
IdSMTP.UseTLS := utUseExplicitTLS;

{отправляем письмо}
IdSMTP.Connect();
except
MessageBox(handle,pchar('ОШИБКА!!! Подключение к SMTP серверу не удалось'+#10+#13+
'Проверьте настройки программы, а так же не блокируется ли'+#10#13+
'порт SMTP сервера антивирусом или файреволом(брандмауэром)'), pchar(Mail.Caption), 48);
exit;
end;
IdSMTP.Send(IdMessage1);
Application.ProcessMessages;
IdSMTP.Disconnect;
на событие OnClose вешаем следующее:
{очищаем память}
idMessage1.Free;
IdSSLIOHandlerSocketOpenSSL.Free;
idSMTP.Free;
Вот собственно и все. Жду ваших комментариев.