1

我正在尝试通过 ActionMailer for MVC3/MVC4 for C# ASP.NET 异步发送一封电子邮件。

但是我遇到了两个问题:

  1. 如果我尝试使用私有函数使用 Task.Run 或 Task.Start 方法,则 HttpContext 变为空,并且电子邮件将不会发送。如果我使用内置的异步交付方法,情况也是如此。

  2. 如果我尝试将 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 中的哪些信息来发送电子邮件),或者能够异步/等待它。

4

2 回答 2

0

我最终想出的解决方案是创建一个控制器方法来发送电子邮件,然后在我原来的控制器方法中,向该控制器方法发出 Web 请求,而不考虑响应。在该方法中,模型的 id 被发送,以在电子邮件功能中从数据库中检索正确的模型。这保留了 HttpContext。

string url = baseUrl + "/api/Entry/SendEmail?emailId=" + emailId;
WebRequest req = WebRequest.Create(url);
req.Method = "GET";
req.BeginGetResponse(null, null);
于 2013-04-24T00:58:30.317 回答
0

HttpContext是生成所必需的,EmailResult 即控制器SendMail方法的返回值。

Deliver()方法可以在单独的线程中调用。

var verificationEmail = new MailController().SendMail(email, new MailModel());
Task.Run(() => verificationEmail.Deliver());
于 2016-08-23T06:44:10.460 回答