3

添付ファイル付きの電子メールを送信する Delphi 6 アプリケーションがあります。最初にテストしたとき、TIdSmtp.Connect() を呼び出したときに 11004 エラー (ポリシー違反) が発生しました。電子メール サーバーの SMTP 設定が間違っていたことが判明し、現在は正常に動作しています。しかし、ユーザーがトラブルに遭遇することは承知しており、デバッグ作業を支援するために Indy コンポーネントを介して SMTP サーバーからより広範なエラー情報を取得する方法があるかどうかを知りたい. Delphi 6 で Indy 9 を使用しています。

より詳細なレポートを取得して、エラーの考えられる原因を調べる方法はありますか? (例 - SSL が必要、From フィールドが入力されていない、拒否されたドメインなど)。また、同じ質問ですが、TIdSmtp.Send() メソッドでエラーが発生した場合は?

4

1 に答える 1

7

EIdSMTPReplyErrorSMTP プロトコル層で SMTP サーバーからのエラー メッセージに応答して発生します。 11004SMTP エラーではなく、ソケット/DNS エラーです。SysErrorMessage()基本的な OS エラー メッセージ (から取得できます)以外に、追加のエラー情報はありません。

要求された名前は有効であり、データベースで見つかりましたが、解決されている正しい関連データがありません。

に関しては、例外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 コマンド/応答トラフィックを見なければ、何が問題なのかを正確に区別することはできません。

TIdSMTP特に SSL/TLS エラーに関しては、構成に応じて、いくつかの異なることのいずれかが発生する可能性があります。

1)エラーEIdSocketErrorのように、一般的な例外が発生する場合があり11004ます。

2)暗黙的 SSL/TLS を必要とするが に設定してEIdSMTPReplyErrorいないサーバー ポートに接続すると、不正な形式のエラー コードで例外が発生する可能性があります。TIdSMTP.UseTLSutUseImplicitTLS

2)割り当てたが、サーバーが Implicit SSL/TLS を予期していないEIdOSSLConnectError場合、またはその他の OpenSSL 関連の例外が発生する可能性があります。UseTLS=utUseImplicitTLS

3)または のいずれかにUseTLS設定し、サーバーは明示的な TLS をサポートしていますが、何らかの理由で SSL/TLS ハンドシェイクが失敗すると、に対してのみトリガーされるイベントが発生します。イベント ハンドラが を設定しない場合、または を使用した場合は、例外が発生します。utUseExplicitTLSutRequiresTLSTIdSMTP.OnTLSHandShakeFailedutUseExplicitTLSVContinue=TrueutRequiresTLSEIdTLSClientTLSHandShakeFailed

4)または のいずれかにUseTLS設定し、サーバーが明示的な TLS をサポートしていない場合、イベントがトリガーされます。イベント ハンドラが を設定しない場合、または を使用した場合は、例外が発生します。utUseExplicitTLSutRequiresTLSTIdSMTP.OnTLSNotAvailableutUseExplicitTLSVContinue=TrueutRequiresTLSEIdTLSClientTLSNotAvailable

于 2012-05-17T18:51:49.260 に答える