Отправка электронной почты с использованием 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 исключение было поднято впоследствии.

Другие вопросы по тегам