使用TIdSmtp.Connect()方法发生错误11004时获取扩展错误信息?

时间:2012-05-17 04:39:57

标签: delphi email smtp indy

我有一个Delphi 6应用程序,它发送带有附件的电子邮件。当我第一次测试它时,我在调用TIdSmtp.Connect()时遇到了11004错误(策略违规)。事实证明我的电子邮件服务器SMTP设置错误,现在它工作正常。但是知道我的用户会遇到麻烦,我想知道是否有办法通过Indy组件从SMTP服务器获取更广泛的错误信息,以帮助我调试工作。我正在使用Indy 9和Delphi 6。

有没有办法获得更丰富的报告,并找出错误的可能原因是什么? (例如 - 需要SSL,来自未填写的字段,拒绝的域等)。同样的问题,但是当TIdSmtp.Send()方法发生错误时?

1 个答案:

答案 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设置为utUseExplicitTLSutRequiresTLS且服务器支持显式TLS,但SSL / TLS握手因任何原因失败,您将获得{{1} 1}}事件仅针对TIdSMTP.OnTLSHandShakeFailed触发。如果事件处理程序未设置utUseExplicitTLS,或者您使用了VContinue=True,则会引发utRequiresTLS异常。

4)您将EIdTLSClientTLSHandShakeFailed设置为UseTLSutUseExplicitTLS且服务器不支持显式TLS,您将获得{{1}触发的utRequiresTLS事件}} 只要。如果事件处理程序未设置TIdSMTP.OnTLSNotAvailable,或者您使用了utUseExplicitTLS,则会引发VContinue=True异常。