当我在IdSMTP设置ConnectTimeout(例如,30秒)并且SMTP服务器不可用时,它从SMTP服务器起飞约105秒。
这是版本10中的Indy组件 - * 250.bpl,OpenSSL v1.0.2。
使用IdFTP ConnectTimeout可以毫无问题地工作。
哪里可能是个错误?
...
IdOpenSSLSetLibPath(FDocumentsPath);
SSLHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
SMTP:= TIdSMTP.Create(nil);
MSG:= TIdMessage.Create(nil);
try
SSLHandler.SSLOptions.Method:= sslvSSLv23;
SSLHandler.SSLOptions.Mode := sslmClient;
SMTP.IOHandler := SSLHandler;
SMTP.UseTLS:= utUseImplicitTLS;
SMTP.AuthType:= satDefault;
SMTP.Port:= 465;
SMTP.Host:= xxx.xxx.xxx.xxx;
SMTP.Username:= xxxxx;
SMTP.Password:= xxxxx;
SMTP.ConnectTimeout:= 30000;
SMTP.ReadTimeout:= 30000;
try
SMTP.Connect;
except
end;
...
finally
SMTP.Disconnect;
UnLoadOpenSSLLibrary;
FreeAndNil(MSG);
FreeAndNil(SSLHandler);
FreeAndNil(SMTP);
end;
答案 0 :(得分:2)
ConnectTimeout
由TIdIOHandlerStack
实现,因此同样适用于所有TCP客户端组件(IOW,TIdFTP
和TIdSMTP
使用完全相同的超时逻辑)。
但是,您必须考虑ConnectTimeout
仅适用于实际的连接尝试(对套接字API connect()
函数的调用)。它不适用于将主机名解析为IP地址所需的时间,也不适用于在监视超时时创建和拆除执行实际连接的工作线程所需的时间。所以ConnectTimeout
并不准确。
30秒超时需要105秒可能意味着DNS需要很长时间来解析主机名,或者可能意味着套接字API在超时结束后没有及时中止connect()
调用。调试代码以查看实际花费的时间。检查OnStatus
事件以查看hsResolving
和hsConnecting
通知之间以及hsConnecting
通知与套接字无法连接到服务器时的后续异常之间经过的时间