3

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

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

4

1 回答 1

7

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)EIdSMTPReplyError如果您连接到需要隐式 SSL/TLS 但您没有TIdSMTP.UseTLS设置为utUseImplicitTLS.

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

3) 您已UseTLS设置为utUseExplicitTLSorutRequiresTLS并且服务器支持显式 TLS,但 SSL/TLS 握手无论出于何种原因失败,您将收到TIdSMTP.OnTLSHandShakeFailed仅针对utUseExplicitTLS. 如果未设置事件处理程序VContinue=True,或者您使用utRequiresTLS了 ,您将引发EIdTLSClientTLSHandShakeFailed异常。

4)您已UseTLS设置为utUseExplicitTLSorutRequiresTLS并且服务器不支持显式 TLS,您将获得仅TIdSMTP.OnTLSNotAvailable触发的事件utUseExplicitTLS。如果未设置事件处理程序VContinue=True,或者您使用utRequiresTLS了 ,那么您将EIdTLSClientTLSNotAvailable引发异常。

于 2012-05-17T18:51:49.260 回答