Отправка электронной почты с использованием indy-компонента delphi xe2 Сбой согласования SSL
Я пытался с помощью компонента Indy отправлять электронную почту в XE2, и он отлично работает на моем ноутбуке, на котором я скомпилировал свой проект.
Но если я перенесу свой exe-проект на другой компьютер, появится сообщение об ошибке
Соединение закрыто изящно
или иногда я получаю
Сбой согласования SSL
На самом деле я много раз пытался решить мою проблему, но не могу.
Это мой код - где моя ошибка? Мне нужно практическое решение.
procedure Gmail(username, password, totarget, subject, body :string);
var
DATA : TIdMessage;
SMTP : TIdSMTP;
SSL : TIdSSLIOHandlerSocketOpenSSL;
result:Boolean;
begin
try
SMTP := TIdSMTP.Create(nil);
DATA := TIdMessage.Create(nil);
SSL := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
SSL.Destination := 'smtp.gmail.com:587';
SSL.Host := 'smtp.gmail.com';
// SSL.MaxLineAction.maException;
SSL.Port:= 587;
SSL.SSLOptions.Method := sslvTLSv1;
SSL.SSLOptions.Mode := sslmUnassigned;
SSL.SSLOptions.VerifyMode := [];
SSL.SSLOptions.VerifyDepth := 0;
DATA.From.Address := username;
DATA.Recipients.EMailAddresses := totarget;
DATA.Subject := subject;
DATA.Body.Text := body;
if FileExists('D:\Test1.txt') then
TIdAttachmentFile.Create(DATA.MessageParts, 'D:\Test1.txt');
SMTP.IOHandler := SSL;
SMTP.Host := 'smtp.live.com';
SMTP.Port := 587 ;
SMTP.Username := username;
SMTP.Password := password;
// SMTP.SASLMechanisms;
SMTP.UseTLS := utUseExplicitTLS;
try
try
SMTP.Connect;
SMTP.Send(DATA);
Result := True;
except
on E:Exception do
begin
ShowMessage('Cannot send E-Mail: ' + E.Message);
Result := False;
end;
end;
finally
if SMTP.Connected then SMTP.Disconnect;
end;
except
on E : Exception do
begin
ShowMessage('Error in the function SendEmailDelphi: ' + E.Message);
Result := False;
end;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Timer1.Enabled:= True;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
mail_username := 'email@gmail.com';
mail_password := 'pass';
mail_to := 'email@gmail.com';
mail_subject := 'Text email from Delphi project';
mail_body := 'this is a test email sent from Delphi project, do not reply';
try
begin
Gmail(mail_username, mail_password, mail_to , mail_subject, mail_body);
end;
finally
end;
end;
1 ответ
НЕ устанавливайте SSL.Destination
, SSL.Host
, или же SSL.Port
свойства вручную! TIdTCPClient.Connect()
справится с этим для вас. Кроме того, вы не думаете, что это странно, что вы устанавливаете SSL.Destination/Host
в smtp.gmail.com
но устанавливаем SMTP.Host
в smtp.live.com
вместо? Gmail и Live не являются одним и тем же поставщиком услуг.
Также, SSL.SSLOptions.Mode
должен быть установлен в sslmClient
вместо sslmUnassigned
, Не слишком важно, TIdSSLIOHandlerSocketOpenSSL
просто перевернет его, когда он настроит соединение. Но вы все равно должны это сделать, поскольку вы знаете, что ваш код действует как клиент.
И, наконец, попробуйте установить SMTP.UseTLS
перед установкой SMTP.Port
, как настройка UseTLS
может изменить Port
, поэтому вы хотите убедиться, что вы действительно подключаетесь к тому порту, который ожидаете.
С учетом сказанного SSL Negotiation failed
ошибка означает, что рукопожатие TLS было запущено, но не удалось во время согласования. Попробуйте назначить обработчики TIdSSLIOHandlerSocketOpenSSL
"s OnStatusInfo/Ex
события, чтобы увидеть, как далеко на самом деле идет рукопожатие. И если вы используете относительно современную версию Indy 10, попробуйте взглянуть на поднятые исключения InnerException
собственность, это может дать вам ключ к пониманию того, что пошло не так EIdTLSClientTLSHandShakeFailed
исключение было поднято впоследствии.