1

Sytem.Net.Mailを使用して、C#のWebアプリケーションを介して(別のマシン上の)Exchangeサーバー経由で電子メールを送信しています。(各顧客はSMTP構成を設定できるため、Exchangeを使用できない場合があることに注意してください。)

電子メールを送信するときに、メッセージが配信不能アドレスに送信されても​​例外はスローされません。Exchange、メッセージが送信されなかったことを通知する電子メールを私に送信します。

メッセージは次のとおりです。

Diagnostic information for administrators:

Generating server: (exchange server)

(wrong address)
#550 5.1.1 RESOLVER.ADR.RecipNotFound; not found ##

Original message headers:

Received: from (webserver) by (exchangeserver) with Microsoft SMTP Server id (blah); Fri, 11 Jan 2013 10:16:02 -0500
MIME-Version: 1.0
From: (me)
To: (wrong address)
Date: Fri, 11 Jan 2013 10:16:02 -0500
Subject: (blah)
Content-Type: text/html; charset="utf-8"
Content-Transfer-Encoding: base64
Message-ID: (blah)
Return-Path: (me)

これは、Exchangeサーバーの構成設定が原因ですか?これをキャッチする別の方法はありますか(おそらく、メールを非同期で送信した場合)、またはメッセージが失敗したかどうかを確認できませんか?

要件として、各受信者に個別の電子メールを送信する必要があることに注意してください。したがって、各アドレスに電子メールを送信するforループがあります。無効なアドレスの場合、例外はキャッチされないため、システムは電子メールが正常に送信されたと見なします。

SendEmailErrorは、エラー情報を保持するだけのクラスです。最終的に返されるのは、アイテムのないリストです。無効なアドレスにメッセージを送信する場合、コードは2つのcatchブロックのいずれにも入りません。

コード:

public List<SendEmailError> SendEmail(MailAddress fromAddress, string subject, string body, bool isBodyHTML, MailPriority priority,
                            IEnumerable<MailAddress> toAddresses)
{
    List<SendEmailError> detectedErrors;

    // create the email message
    MailMessage message = new MailMessage()
    {
        Subject = subject,
        SubjectEncoding = Encoding.UTF8,
        Body = body,
        BodyEncoding = Encoding.UTF8,
        IsBodyHtml = isBodyHTML,
        Priority = priority,
        From = fromAddress
    };

    SmtpClient smtpClient = new SmtpClient("myexchangeserver", 25)
    {
        Credentials  = new NetworkCredential("myid", "mypword", "mydomain");
    };

    foreach (MailAddress toAddress in toAddresses)
    {
        message.To.Clear();
        message.To.Add(toAddress);
        try
        {
            smtpClient.Send(message);
        }
        catch (SmtpFailedRecipientsException ex)
        {
            // if the error was related to the send failing for a specific recipient, log
            // that error and continue.
            SendEmailError error = new SendEmailError();
            error.Type = SendEmailError.ErrorType.SendingError;
            error.Exception = ex;
            detectedErrors.Add(error);
        }
        catch (Exception ex)
        {
            // if the error wasn't related to a specific recipient. add
            // an error and stop processing.
            SendEmailError error = new SendEmailError();
            error.Type = SendEmailError.ErrorType.ConnectionError;
            error.Exception = ex;
            detectedErrors.Add(error);
            break;
        }
    }

    return detectedErrors;
}
4

0 に答える 0