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

Rob*_*ler 3 delphi email smtp indy

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

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

Rem*_*eau 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;
Run Code Online (Sandbox Code Playgroud)

这将有所帮助,如果服务器支持扩展错误代码,那么你可能会更接近一些.但更多时候没有,如果不通过线路查看实际的SMTP命令/响应流量,您将无法完全区分出错的地方.

特别是关于SSL/TLS错误,可能会发生以下几种不同的事情之一,具体取决于您的TIdSMTP配置:

1)您可能会收到一般EIdSocketError异常,例如您的11004错误.

2)EIdSMTPReplyError如果连接到需要隐式SSL/TLS但尚未TIdSMTP.UseTLS设置为的服务器端口,则可能会出现格式错误的异常错误代码utUseImplicitTLS.

2)EIdOSSLConnectError如果已UseTLS=utUseImplicitTLS分配但服务器不期望隐式SSL/TLS,则可能会收到与OpenSSL相关的其他异常.

3)你已经UseTLS设置为utUseExplicitTLSutRequiresTLS与服务器支持TLS明确,但SSL/TLS握手因任何原因而失败,你会得到一个TIdSMTP.OnTLSHandShakeFailed事件只触发utUseExplicitTLS.如果未设置事件处理程序VContinue=True,或者您使用了事件处理程序utRequiresTLS,则会引发EIdTLSClientTLSHandShakeFailed异常.

4)你已经UseTLS设置为utUseExplicitTLSutRequiresTLS与服务器不支持TLS明确,你会得到一个TIdSMTP.OnTLSNotAvailable事件触发utUseExplicitTLS只.如果事件处理程序未设置VContinue=True或您使用utRequiresTLS,则会EIdTLSClientTLSNotAvailable引发异常.