1

我有一个客户端试图连接 SMTP 服务器。我将 OnStatus 事件链接到 smtp 客户端并查看

Resolving / Connecting / Connected 状态。但有时在尝试连接时会挂断/应用程序冻结。不过,我看到 OnStatus 引发了 Connected 状态。可能是什么问题。我排除了 smtp 上的 Resolving DNS ans et both ConnectTimeout 和 Readtimeout 设置,如下所示:

  smtp.OnStatus := SMTPStatus;
  smtp.ConnectTimeout := 10000;
  smtp.ReadTimeout := 10000;
  smtp.Connect;
  // SOMETIMES MY LOG DOES NOT GET HERE Log('AfterConnect');
  if smtp.Connected then
  begin
    smtp.Send(Mess);
    smtp.Disconnect;
  end

在大约 600KB 的附件上,它似乎卡在对附件部分进行编码并且永远不会完成,目前编码类型是默认类型。

10/3/2012 10:21:43 AM  Status: Resolving hostname XXXXXXXXXX.com.
10/3/2012 10:21:43 AM  Status: Connecting to 10.5.2.171.
10/3/2012 10:21:44 AM  Status: Connected.
10/3/2012 10:21:45 AM  Status: Encoding text
10/3/2012 10:21:45 AM  Status: Encoding attachment
4

2 回答 2

2

如果OnStatus事件正在报告hsConnected,那么您已物理连接到服务器。如果Connect()之后没有退出,那么它可能会阻塞等待来自服务器的未到达的数据,例如服务器的初始问候语。不过,ReadTimeout应该处理这种可能性(除非您OnConnected分配的事件处理程序正在陷入僵局,也就是说)。使用数据包嗅探器(例如 Wireshark)来确保您实际连接到您期望的服务器,并且它正在发送正确类型的TIdSMTP期望问候数据。

于 2012-09-24T20:20:34.777 回答
1

许多 SMTP 服务器被配置为将初始问候消息延迟 30 秒左右以尝试阻止垃圾邮件,而且大多数服务器可以配置为拒绝来自相同 IP 地址的连接,如果它在指定的时间段内尝试多次连接(通常为 1 分钟)。这可能是导致您出现问题的原因。

于 2012-09-27T13:08:27.200 回答