電子メールメッセージを同期して送信する方法はすでにいくつかあります。
電子メールが失敗した場合、私はこのかなり標準的なコードを使用します:
static void CheckExceptionAndResend(SmtpFailedRecipientsException ex, SmtpClient client, MailMessage message)
{
for (int i = 0; i < ex.InnerExceptions.Length -1; i++)
{
var status = ex.InnerExceptions[i].StatusCode;
if (status == SmtpStatusCode.MailboxBusy ||
status == SmtpStatusCode.MailboxUnavailable ||
status == SmtpStatusCode.TransactionFailed)
{
System.Threading.Thread.Sleep(3000);
client.Send(message);
}
}
}
ただし、SendAsync()を使用して同じことを達成しようとしています。これは私がこれまでに持っているコードです:
public static void SendAsync(this MailMessage message)
{
message.ThrowNull("message");
var client = new SmtpClient();
// Set the methods that is called once the event ends
client.SendCompleted += new SendCompletedEventHandler(SendCompletedCallback);
// Unique identifier for this send operation
string userState = Guid.NewGuid().ToString();
client.SendAsync(message, userState);
// Clean up
message.Dispose();
}
static void SendCompletedCallback(object sender, AsyncCompletedEventArgs e)
{
// Get the unique identifier for this operation.
String token = (string)e.UserState;
if (e.Error.IsNotNull())
{
// Do somtheing
}
}
問題は、トークンやe.Errorを使用して、StatusCodeに必要なチェックを行ってから再送信できるように、例外を取得するにはどうすればよいですか?
私は午後中ずっとグーグルをしていましたが、何もポジティブなものは見つかりませんでした。
アドバイスをいただければ幸いです。