【问题标题】:Get extended error information when an error 11004 occurs using TIdSmtp.Connect() method?使用 TIdSmtp.Connect() 方法发生错误 11004 时获取扩展错误信息?
【发布时间】:2012-05-24 16:28:59
【问题描述】:

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

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

【问题讨论】:

    标签: delphi email smtp indy


    【解决方案1】:

    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 设置为utUseExplicitTLSutRequiresTLS,并且服务器支持显式TLS,但由于某种原因,SSL/TLS 握手失败,您将收到仅针对@ 触发的TIdSMTP.OnTLSHandShakeFailed 事件987654339@。如果事件处理程序没有设置VContinue=True,或者你使用了utRequiresTLS,你会得到一个EIdTLSClientTLSHandShakeFailed 异常。

    4) 您将UseTLS 设置为utUseExplicitTLSutRequiresTLS,并且服务器不支持显式TLS,您将收到仅针对utUseExplicitTLS 触发的TIdSMTP.OnTLSNotAvailable 事件。如果事件处理程序没有设置VContinue=True,或者你使用了utRequiresTLS,那么你会得到一个EIdTLSClientTLSNotAvailable 异常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-12
      • 1970-01-01
      • 2011-03-17
      • 1970-01-01
      相关资源
      最近更新 更多