通过ActionMailer异步发送电子邮件

时间:2013-04-17 05:05:33

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

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

但是我遇到了两个问题:

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

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

2 个答案:

答案 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());