Чтобы использовать STARTTLS
, вам нужно
назначить компонент SSLIOHandler, такие как TIdSSLIOHandlerSocketOpenSSL
, к TIdSMTP.IOHandler
собственности. Вам придется развернуть DLL OpenSSL с вашим приложением, если оно еще не установлено на целевой машине, на которой будет запущено ваше приложение.
присвоено имя TIdSMTP.UseTLS
собственности utUseExplicitTLS
, чтобы включить STARTTLS
. Убедитесь, что значение TIdSMTP.UseEHLO
истинно (по умолчанию), поэтому TIdSMTP
может узнать, поддерживает ли сервер STARTTLS
.
подключения к порту 587.
Попробуйте это:
uses
IdSMTP, IdMessage, IdEMailAddress, IdSSLOpenSSL;
procedure SendSimpleMail;
var
IdSMTP: TIdSMTP;
IdMessage: TIdMessage;
IdEmailAddressItem: TIdEmailAddressItem;
IdSSL: TIdSSLIOHandlerSocketOpenSSL;
begin
IdSMTP := TIdSMTP.Create(nil);
try
IdSSL := TIdSSLIOHandlerSocketOpenSSL.Create(IdSMTP);
IdSMTP.IOHandler := IdSSL;
IdSMTP.UseTLS := utUseExplicitTLS;
IdSMTP.Host := 'smtp.gmail.com';
IdSMTP.Port := 587;
IdSMTP.AuthType := satDefault;
IdSMTP.Username := '[email protected]';
IdSMTP.Password := 'password';
IdSMTP.Connect;
if IdSMTP.Authenticate then
begin
IdMessage := TIdMessage.Create(nil);
try
IdMessage.From.Name := 'User Name';
IdMessage.From.Address := 'usernam[email protected]';
IdMessage.Subject := 'E-mail subject';
IdMessage.Body.Add('E-mail body.');
IdEmailAddressItem := IdMessage.Recipients.Add;
IdEmailAddressItem.Address := '[email protected]';
IdSMTP.Send(IdMessage);
finally
IdMessage.Free;
end;
end;
IdSMTP.Disconnect;
finally
IdSMTP.Free;
end;
end;
Update: код выше предназначен для Indy 10. Если вы используете Indy 9 вместо этого, есть некоторые различия.
Компонент OpenSSL был назван TIdSSLIOHandlerSocket
.
TIdSMTP
не поддерживает STARTTLS
еще. Вам нужно было бы вручную управлять свойством PassThrough` SSLIOHandler's
.
При подключении к порту 587 для явного TLS, вы должны установить PassThrough
к истинным изначально, так что вы подключитесь к серверу в незашифрованном виде, а затем отправить команду STARTTLS
вручную и установить PassThrough
к ложным, чтобы активировать шифрование перед отправкой любого дальнейшие команды SMTP.
Procedure SendMail();
begin
IdSMTP1.Host := 'smtp.gmail.com';
IdSMTP1.AuthenticationType := atLogin;
IdSMTP1.Port := 587;
IdSMTP1.Username := '[email protected]';
IdSMTP1.Password := 'password';
IdSSLIOHandlerSocket1.PassThrough := True;
IdSMTP1.Connect;
try
IdSMTP1.SendCmd('STARTTLS', [220]);
IdSSLIOHandlerSocket1.PassThrough := False;
IdSMTP1.SendCmd('EHLO ' + IdSMTP1.LocalName);
IdSMTP1.Authenticate;
IdMessage1.Body.Add('Test Message');
IdMessage1.From.Address := '[email protected]';
IdMessage1.Recipients.EMailAddresses := '[email protected]';
IdMessage1.Subject := 'Hi';
try
IdSMTP1.Send(IdMessage1);
except
ShowMessage('Error : email not send');
end;
finally
IdSMTP1.Disconnect;
end;
end;
При подключении к порту 465 для неявной SSL, все, что вам нужно сделать, это установить PassThrough
ложь перед подключением к серверу. Первоначально соединение будет зашифровано перед отправкой любых команд SMTP вообще, не нужно STARTTLS
.
Procedure SendMail();
begin
IdSMTP1.Host := 'smtp.gmail.com';
IdSMTP1.AuthenticationType := atLogin;
IdSMTP1.Port := 465;
IdSMTP1.Username := '[email protected]';
IdSMTP1.Password := 'password';
IdSSLIOHandlerSocket1.PassThrough := False;
IdSMTP1.Connect;
try
IdMessage1.Body.Add('Test Message');
IdMessage1.From.Address := '[email protected]';
IdMessage1.Recipients.EMailAddresses := '[email protected]';
IdMessage1.Subject := 'Hi';
try
IdSMTP1.Send(IdMessage1);
except
ShowMessage('Error : email not send');
end;
finally
IdSMTP1.Disconnect;
end;
end;
Спасибо, Здесь я использую Delphi 7.0 не будет поддерживать DLL TIdSSLIOHandlerSocketOpenSSL, так что я могу изменить кодировку, как так. Так как я получил то же сообщение об ошибке в этом коде. – Barani
Здесь я использую версию Indy 9.00.10. Он показывает «Не удалось загрузить библиотеку SSL». ошибка. Порт: 587, а также я попытался кодировать порт 465, он также вызывает ошибку «Соединение закрыто грациозно». – Barani
Кроме того, я добавил подробный скриншот компонента для моего вопроса. – Barani