使用TIdSSLIOHandlerSocketOpenSSL时,idSMTP时的连接超时

时间:2014-07-01 08:54:24

标签: delphi delphi-xe indy10

我使用 TidSMTP TIdSSLIOHandlerSocketOpenSSL ,只需连接到"套接字错误" 就会出现问题服务器。

这是表单组件代码

  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

和Delphi Code

 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读取服务器问候语后,连接正常发送电子邮件。

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发送电子邮件。

雷鸟: Wireshark capture - Sending email using thunderbird

印: Wireshark capture - Using Indy

否&#34; 客户端密钥交换,...​​ &#34;发生在我的计划上。

解决

通过手动设置connectiontimeout

解决了这个问题

2 个答案:

答案 0 :(得分:3)

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

要记住一些事项 - 设置UseTLS属性可能会更改Port属性,因此请确保Port实际上是您在调用Connect()时所期望的。为确保这一点,请在设置Port之后设置UseTLS,而不是之前设置。{/ p>

答案 1 :(得分:0)

请检查您的防火墙是否已暂时停用。 我到了这个页面,因为我遇到了同样的问题 - 立即断开&#34; Connection正常关闭&#34;使用SSL执行SMTP时。 然后我禁用了我的Avast!防火墙,这很好。