【问题标题】:Indy SMTP hangs or freezes up on Connect methodIndy SMTP 在 Connect 方法上挂起或冻结
【发布时间】:2012-09-16 07:54:57
【问题描述】:

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

正在解决/正在连接/已连接状态。但有时在尝试连接时会挂断/应用程序冻结。不过,我看到 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

【问题讨论】:

    标签: delphi smtp c++builder indy


    【解决方案1】:

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

    【讨论】:

    • 如果是这种情况,TIdSMTP 将不会到达编码阶段,如 Dmitry 的日志所示。 TIdSMTP 必须先验证服务器的问候语,然后才能执行其他任何操作。
    • @Remy 我很久以前添加了这个答案,然后才编辑问题以包含日志和更多信息。根据现有信息,这是我的最佳猜测。
    • 抱歉,我没有注意到时间戳。
    【解决方案2】:

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

    【讨论】:

    • 是的,当您遇到网络通信问题时,您应该始终嗅探数据包以排除通信错误,然后再跟踪编码错误。
    • 这与Connect() 冻结无关。那是一个完全不同的问题。 Indy 会在电子邮件被传输时对其进行动态编码。因此,要么 Indy 在读取附件数据时陷入死锁,要么 Indy 存在导致编码过程崩溃/死锁的错误,要么 SMTP 服务器已停止接收数据,因此当传出缓冲区填满时,Indy 的套接字会被阻塞。
    • 那么对于这种情况有什么解决方法,在线程中设置一个定时器是否有意义,可以释放 smtp 客户端导致强制终止?
    • 不,您需要追踪在发送/编码过程中实际冻结的内容并修复它(或者,如果它是 Indy 内部的错误,请告诉我,以便我修复它)。您可以编译 Indy 进行调试,然后在调试器中单步调试其源代码。
    • 我大概可以在 Indy 代码中记录日志,您知道代码的哪些区域可能会出现这种冻结吗?我们使用 D2007 和 Indy 10
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多