【问题标题】:Connection Timeout when idSMTP when using TIdSSLIOHandlerSocketOpenSSL使用 TIdSSLIOHandlerSocketOpenSSL 时 idSMTP 时的连接超时
【发布时间】:2014-07-01 08:54:24
【问题描述】:

我在使用 TidSMTPTIdSSLIOHandlerSocketOpenSSL 时遇到问题,仅通过连接到服务器即可获得 "Socket Error"

这是表单组件代码

  object IdSMTP: TIdSMTP
    IOHandler = IdSSLIOHandlerSSL
    Port = 465
    SASLMechanisms = <>
    UseTLS = utUseImplicitTLS
    Left = 93
    Top = 49
  end
  object IdSSLIOHandlerSSL: TIdSSLIOHandlerSocketOpenSSL
    OnStatus = IdSSLIOHandlerSSLStatus
    Destination = ':465'
    MaxLineAction = maException
    Port = 465
    DefaultPort = 0
    SSLOptions.Mode = sslmUnassigned
    SSLOptions.VerifyMode = []
    SSLOptions.VerifyDepth = 0
    OnStatusInfo = IdSSLIOHandlerSSLStatusInfo
    Left = 88
    Top = 112
  end

和德尔福代码

 IdSMTP.Username  := 'username';
 IdSMTP.Password  := 'password';
 IdSMTP.Host      := 'domain';
 IdSMTP.Port      := 465;
 IdSMTP.UseTLS    := utUseImplicitTLS;
 try
    IdSMTP.Connect;
 except
    on E:Exception do
       // Socket Error, Connection Timeout is thrown.
       Memo1.Lines.Add(E.Message);
 end;

我记录了 SSL IO 状态并得到了这个:

Resolving hostname {domain}.
Connecting to {ip}.
SSL status: "before/connect initialization"
SSL status: "before/connect initialization"
SSL status: "SSLv3 write client hello A"
SSL status: "SSLv3 read server hello A"
Socket Error # 10060
Connection timed out.

顺便说一下,我们的邮件服务器正在使用自签名证书。

我做错了什么?

TIA

更新:2014 年 7 月 2 日

尝试了Sending mail to Gmail using Indy 提示,但在 SSLv3 读取服务器您好 A 之后,我也收到 Connection Closed Gracefully 发送电子邮件。

Resolving hostname smtp.gmail.com.
Connecting to 74.125.25.108.
Connected.
Sending Email..
SSL status: "before/connect initialization"
SSL status: "before/connect initialization"
SSL status: "SSLv3 write client hello A"
SSL status: "SSLv3 read server hello A"
Disconnected.
Connection Closed Gracefully.

这是新代码:

 IdSMTP.Username  := 'username';
 IdSMTP.Password  := 'password';
 IdSMTP.Host      := 'smtp.gmail.com';
 IdSMTP.UseTLS    := utUseExplicitTLS;
 IdSMTP.Port      := 587;
 try
    // Can connect successfully
    IdSMTP.Connect;

    // This part throws the exception
    IdSMTP.Send(IdMessage);
 except
    on E:Exception do
       // Disconnected, connection closed gracefully 
       Memo1.Lines.Add(E.Message);
 end;

更新:

尝试使用连接到同一域的 Thunderbird 发送电子邮件。

雷鸟:

印地:

我的程序中没有发生“客户端密钥交换,...​​”。

已解决

此问题已通过手动设置连接超时解决

【问题讨论】:

    标签: delphi delphi-xe indy10


    【解决方案1】:

    您正在使用隐式 SSL。这意味着一旦套接字连接到服务器,在交换任何应用程序数据(SMTP 命令/响应)之前,就会启动 SSL 握手。客户端 hello 被发送到服务器,然后在等待服务器发送回 hello 作为响应时发生超时。这意味着服务器没有在您连接的端口上使用 SSL。

    记住一点 - 设置 UseTLS 属性可能会更改 Port 属性,因此请确保在调用 Connect()Port 实际上是您所期望的。为了确保这一点,请尝试在设置UseTLS 之后而不是之前设置Port

    【讨论】:

    • 超时/套接字错误发生在服务器 hello 之后,没有额外的延迟。连接突然终止。
    • 该端口使用 SSL,因为我们可以使用 Thunderbird 等其他邮件客户端发送电子邮件。在设置 UseTLS 后进行端口分配也有同样的结果。
    • 立即断开连接可能意味着 Gmail 拒绝握手。您是否尝试过使用数据包嗅探器查看握手消息?另外,在连接到 Gmail 时,您是否将 SSLVersion 设置为 TLSv1?不要使用 SSLv3。
    • 我只使用 v1。使用wireshark 进行嗅探,发现使用Indy 时不会发生客户端密钥交换(我们使用的是自签名证书)。我会看看如何与我们的服务器交换密钥。
    • 您的客户端在收到服务器问候后正在关闭套接字(发送FIN TCP 数据包)。 OpenSSL 正在拒绝服务器的证书,或者正在引发异常等。
    【解决方案2】:

    请检查您的防火墙是否已暂时禁用。 我进入这个页面是因为我遇到了同样的问题 - 在使用 SSL 进行 SMTP 时,立即断开连接并显示“正常关闭连接”。 然后我禁用了我的 Avast!防火墙,没问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-21
      • 1970-01-01
      • 2017-05-06
      • 2018-07-24
      • 1970-01-01
      • 2011-10-28
      • 1970-01-01
      • 2021-06-01
      相关资源
      最近更新 更多