C#で書かれたクライアントアプリケーションを使用して、企業のExchangeサーバーに大量の電子メールを送信しています。どのようにSMTPタイムアウトを処理するのですか
クライアントアプリケーションがタイムアウトすることがあります(サーバーではありません)。 サーバーが要求を完了したかどうかを知る方法がないので、この場合の再試行の処理方法は?
重複を避けるために使用できるIDはありません。 タイムアウトを長く設定したり、タイムアウトを無限に設定したりするのは良いポリシーではありません。
私は再試行のために指数バックオフアルゴリズムを使用しています。この場合、次回より長く待つため、複製は1つしか送信しません。
私は弾丸の解決策はないと思います。とにかく、それは種類の最初のプロジェクトなので、私は誰かが私が見逃している解決策を持っているかどうかを確認する必要があります。
更新: 交換が中継をしています。私は電子メールを送信するためにSmtpClientを使用しています。 問題は、サーバーが250 Okメッセージを送信できますが、受信者はそれを取得せずに再試行することです。それが私がこの記事で解決しようとしている唯一の問題です。
Restサービスでは、同時実行エラーを使用することをお勧めします。クライアントが何かを投稿し、メッセージがすでにサーバーに格納されていることを意味する「409 - 競合」ステータスを取得した場合しかし、そこでは、クライアントによって作成されたメッセージのキーとなるものがメッセージの一部です。 SMTPはそれを防ぐメカニズムを持っていないようです。
私は理解していません。クライアントのタイムアウトが発生した場合、クライアントはサーバーの応答を待つことをあきらめているので、要求を受信していないため、要求の結果がわからないことを意味します。 例:通信が切断された場合、サーバーは最後まで進みますが、クライアントは応答を受信しません。他の例では、サーバーはビジー状態だったので、31秒後に要求を処理しましたが、クライアントは30後にあきらめます。 – ByteArtisan
非常にシンプルです:当時の各SMTPサーバーは[RFC 5321](https://tools.ietf。 org/html/rfc5321#section-4.5.4。)_keepは、そのURLをスクロールすることができることに注意してください。アプリケーションはRFC 5321に準拠していなければなりません。つまり、処理が途中で中断された場合、サーバーは電子メールを処理できませんでした。これは単純に機能しなくなり、RFC 5321に違反します。つまり、アプリケーションがRFCに記載されている250 OK、リモートサーバーによって受け入れられます。そうでない場合は、再送信する必要があります。 – BastianW
私たちが同じページにいるかどうかはわかりません。 Microsoft交換サーバーは、私にメッセージをリレーするように構成されているので、RFC 5321がこのサーバーによって保証されるはずです。どのようにしてもRFC 5321に準拠する必要がありますか? 私は一度に1つのメッセージを送信し、前に結果を確認しています。エラーの場合、私は5回再試行し、それは私の問題が最初にあった場所です。タイムアウトがあれば、進める方法。 – ByteArtisan