如何在SendMailAsync方法中捕获异常
我在.net 4.5中有一个C#wcf Windows服务,每天向大约1000个不同的客户发送电子邮件。我想尝试使用我在这里找到的这段代码发送电子邮件异步,但我应该如何包装它以捕捉异常?如何在SendMailAsync方法中捕获异常
public async Task SendAsync(string subject, string body, string recipient)
{
var mailMessage = new MailMessage("[email protected]", recipient, subject, body);
mailMessage.IsBodyHtml = true;
using(var client = new SmtpClient("mysmtpserver"))
{
try
{
await client.SendMailAsync(mailMessage);
}
catch (Exception ex)
{
// Log here
}
}
}
我在等待无效的电子邮件地址和服务器超时。
我是否应该在尝试抓包中等待呼叫?不知道这会工作。
另外哪里是放置通过所有邮件地址的foreach循环的最佳位置?
谢谢。
我是不是应该试着将这个await Call包装起来?不知道这会工作。
是的,await
传播异常,这将工作。当然,在邮件离开你的服务器之后,你会发生许多邮件传递失败,并且你会得到反弹甚至一无所获。无论您如何发送邮件,这都是无法检测到的。
还有哪里是放置通过所有邮件地址的foreach循环的最佳位置?
不确定你的意思。围绕对SendAsync
的呼叫放置循环?还有什么地方可以去?我可能误解了。
谢谢。我的意思是,如果我可以发送一个收件人数组,并简单地重用方法内的smtp客户端。 –
你可以做到这一点,但我认为当客户失去联系或其他事情时,客户可能会变得“虚弱”。 – usr
我知道这是一个旧帖子,它已被回复,但我能够使用此方法捕获await
调用。
public async Task <JsonResult> UserDelete(string username) {
// return obj
MFFCommon retval = new MFFCommon();
// get user
var user = UserManager.FindByName(username);
// starts a task
Task removeUserFromAgency = await Task.Factory.StartNew(async() => {
await removeUserFromCurrentAgency(user);
});
// optional, but this will wait 3 sec before checking if it is complete.
removeUserFromAgency.Wait(3000);
if (removeUserFromAgency.IsCompleted) {
retval.taskResponse = "True";
retval.taskError = null;
return Json(retval, JsonRequestBehavior.AllowGet);
} else {
// This is where the exception is at.
retval.taskResponse = "False";
retval.taskError = removeUserFromAgency.Exception.Message;
return Json(retval, JsonRequestBehavior.AllowGet);
}
}
超时是难免的,但无效的电子邮件应之前发送邮件进行检查。不要依赖正常执行流程的异常。 –
取决于您想要的控制流程。你希望它在第一次失败时终止吗? – Aron
只要登录异常并转到下一个收件人即可。 –