我正在尝试通过 ActionMailer for MVC3/MVC4 for C# ASP.NET 异步发送一封电子邮件。
但是我遇到了两个问题:
如果我尝试使用私有函数使用 Task.Run 或 Task.Start 方法,则 HttpContext 变为空,并且电子邮件将不会发送。如果我使用内置的异步交付方法,情况也是如此。
如果我尝试将 async/await 放在电子邮件发送功能上,那将不起作用,因为 return 方法是无效的,并且我被告知您不能在 void 功能上等待。
这是我在这两种情况下使用的代码(在这两种情况下,假设 e 是一个模型对象):
场景一:
Action mailAction = new Action(() => { OnSentEmail(e); });
Task mailTask = new Task(mailAction);
mailTask.Start();
private void OnSentEmail(Model e)
{
new MailController().SendMail(e).Deliver();
//HttpContext is null here, so cannot send mail
}
OR
new MailController().SendMail(e).DeliverAsync();
场景二:
await Task.Run(async() => await new MailController().SendMail(e).Deliver());
我对异步方法还不是很好,但这似乎是我能想到的最好的方法。我不能使用常规的 SmtpClient,因为需要发送的电子邮件是丰富的 HTML 格式,所以这就是我选择 ActionMailer 的原因,这样我就可以发送电子邮件并设置它们的样式,就好像它们是视图一样。
我需要的是能够异步发送电子邮件,或者通过强制输入 HttpContext(我不知道 MailerBase 使用 HttpContext 中的哪些信息来发送电子邮件),或者能够异步/等待它。