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