【问题标题】:Send email using indy component delphi xe2 SSL negotiation faild使用 indy 组件 delphi xe2 SSL 协商发送电子邮件失败
【发布时间】:2019-08-25 04:04:51
【问题描述】:

我尝试使用 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;

【问题讨论】:

  • 你在另一台电脑上安装了 libeay32.dll 和 ssleay32.dll 吗?
  • @tomBrunberg,我将dll文件安装在我的项目文件夹中,并将dll文件复制到系统文件中..问题仍然没有解决!!

标签: delphi smtp delphi-xe2 indy10


【解决方案1】:

请勿手动设置SSL.DestinationSSL.HostSSL.Port 属性! TIdTCPClient.Connect() 为您处理。此外,您不觉得将SSL.Destination/Host 设置为smtp.gmail.com 而是将SMTP.Host 设置为smtp.live.com 很奇怪吗? Gmail 和 Live 不是同一个服务提供商。

此外,SSL.SSLOptions.Mode 应设置为 sslmClient 而不是 sslmUnassigned。不太重要,TIdSSLIOHandlerSocketOpenSSL 在配置连接时会简单地翻转它。但无论如何你都应该这样做,因为你知道你的代码是作为客户端的。

最后,尝试设置SMTP.UseTLS before设置SMTP.Port,因为设置UseTLS 可能更改Port,所以你要确保你确实连接到您期望的正确端口。

话虽如此,SSL Negotiation failed 错误意味着 TLS 握手已启动,但在协商过程中失败。尝试将处理程序分配给TIdSSLIOHandlerSocketOpenSSLOnStatusInfo/Ex 事件,以查看握手的实际进展情况。如果您使用的是相对现代的 Indy 10 版本,请尝试查看引发的异常的 InnerException 属性,它可能会为您提供关于在随后引发 EIdTLSClientTLSHandShakeFailed 异常之前出现问题的线索。

【讨论】:

  • 非常感谢,问题解决了,.......................但是, 还有一个问题向我提出来了!!! “无法加载 SSL 库”我将 dll 文件 library32.dll 和 ssleay32.dll 复制到我的项目文件夹,但这个问题仍然显示给我! .............................我该如何解决?
  • Indy 在IdSSLOpenSSLHeaders 单元中有一个WhichFailedToLoad() 函数,用于返回无法加载OpenSSL 的原因。 DLL 本身无法加载到内存中,或者您使用的 DLL 版本缺少一个或多个 Indy 认为对其使用“至关重要”的导出函数。
  • 我有一个类似的问题,我无法解决。该代码是在 W7 桌面上开发的,它在那里工作正常(也可以在另一个桌面 W10 上)。但是,它在我尝试过的许多笔记本电脑上的 ReadTimeOut 执行失败。笔记。它曾经在笔记本电脑上也能正常工作,但最近发生了一些变化,导致它停止工作。我怀疑 Windows 更新。我已经尝试了上面建议的修复,但问题仍然存在。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-08
  • 2010-12-20
  • 1970-01-01
  • 2017-12-08
  • 1970-01-01
  • 2015-10-24
相关资源
最近更新 更多