我已经有几种方法可以同步发送电子邮件。
如果电子邮件失败,我会使用这个相当标准的代码:
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进行必要的检查然后重新发送?
我整个下午一直在谷歌搜索,但没有发现任何积极的事情。
任何建议表示赞赏。
答案 0 :(得分:4)
e.Error
已经在发送电子邮件异步时发生了异常。您可以查看Exception.Message
,Exception.InnerException
,Exception.StackTrace
等,以获取更多详细信息。
<强>更新强>
检查Exception是否为SmtpException类型,如果是,则可以查询StatusCode。像
这样的东西if(e.Exception is SmtpException)
{
SmtpStatusCode code = ((SmtpException)(e.Exception)).StatusCode;
//and go from here...
}
check here了解更多详情。