EIdSMTPReplyError 是为了响应来自 SMTP 协议层的 SMTP 服务器的错误消息而引发的。 11004 是套接字/DNS 错误,而不是 SMTP 错误。除了基本的操作系统错误消息(您可以从SysErrorMessage() 获得)之外,没有其他可用的错误信息:
请求的名称有效且已在数据库中找到,但它没有正在解析的正确关联数据。
关于TIdSMTP.Send(),可以查找EIdSMTPReplyError的异常,例如:
try
IdSMTP1.Connect;
try
IdSMTP1.Send(IdMessage1);
finally
IdSMTP1.Disconnect;
end;
except
on E: EIdSMTPReplyError do
Application.MessageBox(
PChar(
'Error message: ' + E.Message + sLineBreak +
'Error code: ' + IntToStr(E.ErrorCode) + sLineBreak +
'Error reply: ' + E.EnhancedCode.ReplyAsStr
),
'SMTP Error...', MB_OK + MB_ICONSTOP + MB_TOPMOST);
end;
这会有所帮助,如果服务器支持扩展错误代码,那么您可能会更接近一点。但更多时候不是,如果不查看实际的 SMTP 命令/响应流量,您可能无法准确区分出了什么问题。
特别是关于 SSL/TLS 错误,可能会发生几种不同的事情之一,具体取决于您的 TIdSMTP 配置:
1) 您可能会遇到一般的 EIdSocketError 异常,例如您的 11004 错误。
2) 如果您连接到需要隐式 SSL/TLS 但您没有将 TIdSMTP.UseTLS 设置为 utUseImplicitTLS 的服务器端口,您可能会收到带有格式错误的错误代码的 EIdSMTPReplyError 异常。
2) 如果您分配了 UseTLS=utUseImplicitTLS 但服务器不期待隐式 SSL/TLS,您可能会收到 EIdOSSLConnectError 或其他与 OpenSSL 相关的异常。
3) 您将UseTLS 设置为utUseExplicitTLS 或utRequiresTLS,并且服务器支持显式TLS,但由于某种原因,SSL/TLS 握手失败,您将收到仅针对@ 触发的TIdSMTP.OnTLSHandShakeFailed 事件987654339@。如果事件处理程序没有设置VContinue=True,或者你使用了utRequiresTLS,你会得到一个EIdTLSClientTLSHandShakeFailed 异常。
4) 您将UseTLS 设置为utUseExplicitTLS 或utRequiresTLS,并且服务器不支持显式TLS,您将收到仅针对utUseExplicitTLS 触发的TIdSMTP.OnTLSNotAvailable 事件。如果事件处理程序没有设置VContinue=True,或者你使用了utRequiresTLS,那么你会得到一个EIdTLSClientTLSNotAvailable 异常。