【问题标题】:Sending an Email asynchronously via ActionMailer通过 ActionMailer 异步发送电子邮件
【发布时间】:2013-04-17 05:05:32
【问题描述】:

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

但是我遇到了两个问题:

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

  2. 1234563 /li>

这是我在两种情况下都使用的代码(在这两种情况下,假设 e 是一个模型对象):

场景 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 中的哪些信息来发送电子邮件),或者能够异步/等待它。

【问题讨论】:

    标签: c# asp.net asp.net-mvc-3 asynchronous actionmailer


    【解决方案1】:

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

    string url = baseUrl + "/api/Entry/SendEmail?emailId=" + emailId;
    WebRequest req = WebRequest.Create(url);
    req.Method = "GET";
    req.BeginGetResponse(null, null);
    

    【讨论】:

      【解决方案2】:

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

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

      var verificationEmail = new MailController().SendMail(email, new MailModel());
      Task.Run(() => verificationEmail.Deliver());
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-21
        • 1970-01-01
        相关资源
        最近更新 更多