如何在SendMailAsync方法中捕获异常

如何在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循环的最佳位置?

谢谢。

+0

超时是难免的,但无效的电子邮件应之前发送邮件进行检查。不要依赖正常执行流程的异常。 –

+0

取决于您想要的控制流程。你希望它在第一次失败时终止吗? – Aron

+0

只要登录异常并转到下一个收件人即可。 –

我是不是应该试着将这个await Call包装起来?不知道这会工作。

是的,await传播异常,这将工作。当然,在邮件离开你的服务器之后,你会发生许多邮件传递失败,并且你会得到反弹甚至一无所获。无论您如何发送邮件,这都是无法检测到的。

还有哪里是放置通过所有邮件地址的foreach循环的最佳位置?

不确定你的意思。围绕对SendAsync的呼叫放置循环?还有什么地方可以去?我可能误解了。

+0

谢谢。我的意思是,如果我可以发送一个收件人数组,并简单地重用方法内的smtp客户端。 –

+0

你可以做到这一点,但我认为当客户失去联系或其他事情时,客户可能会变得“虚弱”。 – 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); 
 
    } 
 
}