我有一个Delphi 6应用程序,它发送带有附件的电子邮件。当我第一次测试它时,我在调用TIdSmtp.Connect()时遇到了11004错误(策略违规)。事实证明我的电子邮件服务器SMTP设置错误,现在它工作正常。但是知道我的用户会遇到麻烦,我想知道是否有办法通过Indy组件从SMTP服务器获取更广泛的错误信息,以帮助我调试工作。我正在使用Indy 9和Delphi 6。
有没有办法获得更丰富的报告,并找出错误的可能原因是什么? (例如 - 需要SSL,来自未填写的字段,拒绝的域等)。同样的问题,但是当TIdSmtp.Send()方法发生错误时?
答案 0 :(得分:6)
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但未将EIdSMTPReplyError
设置为TIdSMTP.UseTLS
的服务器端口,则可能会收到错误代码格式错误的utUseImplicitTLS
异常
2)如果您已分配EIdOSSLConnectError
但服务器不期望隐式SSL / TLS,您可能会收到UseTLS=utUseImplicitTLS
或其他与OpenSSL相关的异常。
3)您将UseTLS
设置为utUseExplicitTLS
或utRequiresTLS
且服务器支持显式TLS,但SSL / TLS握手因任何原因失败,您将获得{{1} 1}}事件仅针对TIdSMTP.OnTLSHandShakeFailed
触发。如果事件处理程序未设置utUseExplicitTLS
,或者您使用了VContinue=True
,则会引发utRequiresTLS
异常。
4)您将EIdTLSClientTLSHandShakeFailed
设置为UseTLS
或utUseExplicitTLS
且服务器不支持显式TLS,您将获得{{1}触发的utRequiresTLS
事件}} 只要。如果事件处理程序未设置TIdSMTP.OnTLSNotAvailable
,或者您使用了utUseExplicitTLS
,则会引发VContinue=True
异常。