В данном посте я расскажу как отправлять почту из программ написанных на 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 пути к следующим папкам
- 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 завершена.
Установка 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;
Вот собственно и все. Жду ваших комментариев.