我有一个客户端试图连接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
答案 0 :(得分:2)
如果OnStatus
事件报告hsConnected
,那么您将物理连接到服务器。如果Connect()
之后没有退出,则可能会阻止等待来自未到达的服务器的数据,例如服务器的初始问候语。 ReadTimeout
应该处理这种可能性(除非你分配了一个OnConnected
事件处理程序,它正在变为死锁,即)。使用数据包嗅探器(如Wireshark)来确保您实际连接到您期望的服务器,并且它正在发送TIdSMTP
期望的正确类型的问候语数据。
答案 1 :(得分:1)
许多SMTP服务器配置为将初始问候消息msg延迟30秒左右以尝试阻止垃圾邮件。此外,如果大多数服务器尝试在指定的情况下多次连接,则可以将其配置为拒绝来自相同IP地址的连接时间段(通常为1分钟)。可能是这会导致你的问题。