-1

C#で書かれたクライアントアプリケーションを使用して、企業のExchangeサーバーに大量の電子メールを送信しています。どのようにSMTPタイムアウトを処理するのですか

クライアントアプリケーションがタイムアウトすることがあります(サーバーではありません)。 サーバーが要求を完了したかどうかを知る方法がないので、この場合の再試行の処理方法は?

重複を避けるために使用できるIDはありません。 タイムアウトを長く設定したり、タイムアウトを無限に設定したりするのは良いポリシーではありません。

私は再試行のために指数バックオフアルゴリズムを使用しています。この場合、次回より長く待つため、複製は1つしか送信しません。

私は弾丸の解決策はないと思います。とにかく、それは種類の最初のプロジェクトなので、私は誰かが私が見逃している解決策を持っているかどうかを確認する必要があります。

更新: 交換が中継をしています。私は電子メールを送信するためにSmtpClientを使用しています。 問題は、サーバーが250 Okメッセージを送信できますが、受信者はそれを取得せずに再試行することです。それが私がこの記事で解決しようとしている唯一の問題です。

Restサービスでは、同時実行エラーを使用することをお勧めします。クライアントが何かを投稿し、メッセージがすでにサーバーに格納されていることを意味する「409 - 競合」ステータスを取得した場合しかし、そこでは、クライアントによって作成されたメッセージのキーとなるものがメッセージの一部です。 SMTPはそれを防ぐメカニズムを持っていないようです。

答えて

0

通常、SMTPサーバーは、標準のSMTPを使用しているときに電子メールを受け入れたかどうかを通知します。

enter image description here enter image description here

は、だからあなたのアプリケーションは、ここでしか応答を追跡するために必要とtimesoutが起こる場合は、すべての電子メールを続行する必要はありませんし、それが停止した場所をピックアップする必要があります。ここではTelnet経由例があります。それは、送信者や受信者が受け入れisn'tことが考えられてところで、あなたのアプリケーションが

この

RFC 5321に記載されている...たびに応答をチェックする必要があります(あなたはその文書をスクロールすることができます):

受信者SMTPが(DATAに応答して「250 OK」メッセージを送信することによって)メールを受け入れると、メッセージの配信または中継のためには という責任を受諾しています。この の責任は真剣に受けなければなりません。ホストが後でクラッシュするか、予測可能なリソースが不足して などの軽い理由のために、 のメッセージが失われてはなりません。 [...]テキストの終わりが正常に受信されて保存されると、SMTP受信者は "250 OK"応答を送信します。

私は電子メールを送信するので、私は4.5.4.1項を考えます。 RFCに準拠した送信メールを処理するフレームワークを使用していない場合は重要です。

例:クライアントは電子メールを生成していますが、本文からの送信中(メール転送の最後の部分)に接続が切断されました。その後、サーバーは電子メールを続行できません。技術的に彼はすべての情報を得ているかもしれませんが、RFCはクライアントにタイムアウトがあり、プロセス全体を終了していないので、彼はそれを送信できませんでした。

更新: C# SmtpClient methodを使用して、あなたはtelnetの例でも同様に見ることができますsmtpStatusCode OK(=「メールが正常にSMTPサービスに送信されましたが。」)をチェックすることです最善の方法。方法はここで何もしていません(技術的に)。このメソッドはRFC 5321にも準拠していますので、smtp sendホイールを再作成する必要はありません。あなたがOKを取得しなかった場合、その間に何かが起きた可能性があり、結果を確認してから再送信する必要があります(または、エラーメッセージが電子メールアドレスが有効でない無限ループを避けるためのもの)。

+0

私は理解していません。クライアントのタイムアウトが発生した場合、クライアントはサーバーの応答を待つことをあきらめているので、要求を受信して​​いないため、要求の結果がわからないことを意味します。 例:通信が切断された場合、サーバーは最後まで進みますが、クライアントは応答を受信しません。他の例では、サーバーはビジー状態だったので、31秒後に要求を処理しましたが、クライアントは30後にあきらめます。 – ByteArtisan

+0

非常にシンプルです:当時の各SMTPサーバーは[RFC 5321](https://tools.ietf。 org/html/rfc5321#section-4.5.4。)_keepは、そのURLをスクロールすることができることに注意してください。アプリケーションはRFC 5321に準拠していなければなりません。つまり、処理が途中で中断された場合、サーバーは電子メールを処理できませんでした。これは単純に機能しなくなり、RFC 5321に違反します。つまり、アプリケーションがRFCに記載されている250 OK、リモートサーバーによって受け入れられます。そうでない場合は、再送信する必要があります。 – BastianW

+0

私たちが同じページにいるかどうかはわかりません。 Microsoft交換サーバーは、私にメッセージをリレーするように構成されているので、RFC 5321がこのサーバーによって保証されるはずです。どのようにしてもRFC 5321に準拠する必要がありますか? 私は一度に1つのメッセージを送信し、前に結果を確認しています。エラーの場合、私は5回再試行し、それは私の問題が最初にあった場所です。タイムアウトがあれば、進める方法。 – ByteArtisan

0

もう1つの可能なオプションは、Microsoft Exchange Webservicesです。あなたはそれらを使って電子メールを送信することもできます。 hereから例:

// Create an email message and identify the Exchange service. 
EmailMessage message = new EmailMessage(service); 

// Add properties to the email message. 
message.Subject = "Interesting"; 
message.Body = "The merger is finalized."; 
message.ToRecipients.Add("[email protected]"); 

// Send the email message and save a copy. 
message.SendAndSaveCopy(); 

彼らは応答バックとしてもあなたを与える:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> 
    <s:Header> 
    <h:ServerVersionInfo MajorVersion="14" 
       MinorVersion="0" 
       MajorBuildNumber="639" 
       MinorBuildNumber="20" 
       Version="Exchange2010" 
       xmlns:h="http://schemas.microsoft.com/exchange/services/2006/types" 
       xmlns="http://schemas.microsoft.com/exchange/services/2006/types" 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       xm=""lns:xsd="http://www.w3.org/2001/XMLSchema" /> 
    </s:Header> 
    <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <m:CreateItemResponse xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages" 
       xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types"> 
     <m:ResponseMessages> 
     <m:CreateItemResponseMessage ResponseClass="Success"> 
      <m:ResponseCode>NoError</m:ResponseCode> 
      <m:Items /> 
     </m:CreateItemResponseMessage> 
     </m:ResponseMessages> 
    </m:CreateItemResponse> 
    </s:Body> 
</s:Envelope> 
関連する問題