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;
}