我正在尝试通过ActionMailer为C#ASP.NET的MVC3 / MVC4异步发送电子邮件。
但是我遇到了两个问题:
如果我尝试使用私有函数使用Task.Run或Task.Start方法,则HttpContext将变为null,并且电子邮件将不会发送。如果我使用内置的异步传递方法,也会出现这种情况。
如果我尝试将async / await放在电子邮件发送功能上,那不起作用,因为return方法无效,而且我被告知你无法等待无效函数。
< / LI> 醇>以下是我用于两种情况的代码(在两种情况下,假设e是Model对象):
情景1:
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();
情景2:
await Task.Run(async() => await new MailController().SendMail(e).Deliver());
我对异步方法还不是很好,但这似乎是我能想到的最好的方法。我不能使用常规的SmtpClient,因为需要发送的电子邮件是丰富的HTML格式,所以这就是我选择ActionMailer的原因,这样我就可以发送电子邮件并对它们进行样式设置,就好像它们是视图一样。
我需要的是能够异步发送电子邮件,方法是强制使用HttpContext(我不知道MailerBase从HttpContext使用哪些信息来发送电子邮件),或者能够异步/等待它
答案 0 :(得分:0)
我最终提出的解决方案是创建一个控制器方法来发送电子邮件,然后在我的原始控制器方法中,向该控制器方法发出Web请求,而不考虑响应。在该方法中,发送模型的id以从电子邮件功能中的数据库中检索正确的模型。这保留了HttpContext。
string url = baseUrl + "/api/Entry/SendEmail?emailId=" + emailId;
WebRequest req = WebRequest.Create(url);
req.Method = "GET";
req.BeginGetResponse(null, null);
答案 1 :(得分:0)
HttpContext
需要 EmailResult
这是控制器的SendMail
方法
Deliver()
方法可以在一个单独的线程中调用。
var verificationEmail = new MailController().SendMail(email, new MailModel());
Task.Run(() => verificationEmail.Deliver());