Indy SMTP在Connect方法上挂起或冻结

时间:2012-09-24 20:04:12

标签: delphi smtp c++builder indy

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

解析/连接/连接状态。但有时在尝试连接时会出现挂起/应用程序冻结。我看到连接状态是从OnStatus引发的。问题是什么?我排除了在smtp上解析DNS和同时的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

2 个答案:

答案 0 :(得分:2)

如果OnStatus事件报告hsConnected,那么您将物理连接到服务器。如果Connect()之后没有退出,则可能会阻止等待来自未到达的服务器的数据,例如服务器的初始问候语。 ReadTimeout应该处理这种可能性(除非你分配了一个OnConnected事件处理程序,它正在变为死锁,即)。使用数据包嗅探器(如Wireshark)来确保您实际连接到您期望的服务器,并且它正在发送TIdSMTP期望的正确类型的问候语数据。

答案 1 :(得分:1)

许多SMTP服务器配置为将初始问候消息msg延迟30秒左右以尝试阻止垃圾邮件。此外,如果大多数服务器尝试在指定的情况下多次连接,则可以将其配置为拒绝来自相同IP地址的连接时间段(通常为1分钟)。可能是这会导致你的问题。