6

SmtpClient を使用して複数の受信者に電子メールを送信しています。従業員が退職すると、その電子メール アドレスは無効になります。彼らの電子メールアドレスは手動で削除されるまでデータベースに残るため、彼らに電子メールを送信しようとすると、アプリケーションが例外をスローしますSmtpClient.Send(MailMessage)。ただし、例外がスローされても、メールは送信されます。ユーザーがレコードを保存しようとするのをブロックし、データベースから無効なアソシエートを削除するようにアドバイスするわかりやすいメッセージを表示することで、このエラーを処理したいため、これは問題です。

すべての受信者を繰り返し処理して、それらがすべて有効であることを確認する方法があれば、ユーザーが一連の条件を満足するまで、すべてのメールを送信しないようにすることができます。

4

2 に答える 2

7

それは非常に古い質問です。あなたが解決したかどうかはわかりません。

MSDN によると: http://msdn.microsoft.com/en-us/library/swas0fwc(v=vs.100).aspx

Sendを使用して複数の受信者に電子メールを送信し、SMTP サーバーが一部の受信者を有効として受け入れ、他の受信者を拒否する場合、Sendは受け入れられた受信者に電子メールを送信し、 SmtpFailedRecipientsExceptionがスローされます。例外には、拒否された受信者のリストが含まれます。

これは、MSDN から取得したこの例外をキャッチする例です。

try {
    client.Send(message);
}
catch (SmtpFailedRecipientsException ex) {
    for (int i = 0; i < ex.InnerExceptions.Length; i++) {
        SmtpStatusCode status = ex.InnerExceptions[i].StatusCode;
        if (status == SmtpStatusCode.MailboxBusy || status == SmtpStatusCode.MailboxUnavailable) {
            Console.WriteLine("Delivery failed - retrying in 5 seconds.");
            System.Threading.Thread.Sleep(5000);
            client.Send(message);
        } 
        else {
            Console.WriteLine("Failed to deliver message to {0}", ex.InnerExceptions[i].FailedRecipient);
        }
    }
}

ここに完全な例: http://msdn.microsoft.com/en-us/library/system.net.mail.smtpfailedrecipientsexception.aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-2

内部的にSendは、statuscode返された fromRCPT TOコマンドを使用して、適切な例外を発生させます。

PrepareCommandRecipientCommand.Sendメソッドでの実装を確認してくださいsmtpTransport.SendMail(このメソッドは によって内部的に呼び出されSmtpClient.Sendます)。メソッドで解析されたRCPT TOを取得するために使用され、それに応じてが発生します。ただし、VRFY と RCPT はどちらも信頼性が高くありません。これは、メール サーバーがスパム対策として応答を遅らせる (NDR を調整する) か、応答を飲み込む傾向があるためです。StatusCodeCheckResponseSmtpFailedRecipientsException

于 2013-08-01T20:01:24.957 に答える