11

我们从我们的 ASP.NET MVC 3 Razor Web 应用程序发送电子邮件。

目前我们正在使用 ActionMailer.NET。

我看过 MvcMailer。

两者的问题是它们需要一个 Http Context 来执行。

这个问题是我想异步发送电子邮件。现在我知道您可以异步执行实际发送(例如 SMTP 调用),但我希望发送电子邮件的整个过程是异步的,例如:

public ActionResult DoSomething(Something something)
{
   _db.Save(something);

   Task.Factory.StartNew(() => {
      new MailController().DoSomething().Send(something);
   });

   return RedirectToAction("Index");
}

在“DoSomething”方法中,我再次查询数据库,做其他事情等等......我希望所有这些都是异步的 - 因此整个调用都包含在一个任务中,而不是仅仅做.SendAsync(). 希望这是有道理的。

上面的例子是 ActionMailer,它中断了——因为 HTTP 上下文在生成的线程中消失了。

有谁知道我怎样才能让它工作,或者另一个不依赖 HTTP 上下文存在的包?

我不确定为什么需要 HTTP 上下文 - 这里没有请求路由,只是将文件系统上的视图解析为 HTML。

4

3 回答 3

1

ActionMailer.NET 现在可以在 MVC 之外独立使用。

此处介绍了详细信息

http://geeksharp.com/2011/07/06/actionmailer-0-6-released/

于 2012-07-21T04:26:30.997 回答
1

您可以签出使用RazorViewEngine的邮件:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        Task.Factory.StartNew(() =>
        {
            Thread.Sleep(5000);
            dynamic email = new Email("Example");
            email.To = "webninja@example.com";
            email.FunnyLink = "some funny link";
            email.Send();
        });

        return View();
    }
}

和里面~/Views/Emails/Example.cshtml

To: @ViewBag.To
From: lolcats@website.com
Subject: Important Message

Hello,
You wanted important web links right?
Check out this: @ViewBag.FunnyLink

在将应用程序投入生产之前,还要确保您已阅读并理解在 ASP.NET 应用程序中实现后台任务的危险。

于 2012-05-30T07:24:18.607 回答
0

如果您使用的是 .NET 4.5(或任何 Async CTP),您可能需要查看async ActionMethods。坦率地说,我不确定要求是什么(MVC 3/4),但那篇文章应该会有所帮助。

我也不确定您为什么如此担心数据库查找所花费的时间——它真的做了那么多吗?

比 SendAsync 更好的解决方案: 我更喜欢不使用 SendAsync,而是使用常规的 Send 方法通过 SMTP 服务器发送,例如我正在使用的 IIS 中的那个(注意:您必须使用 IIS6 控制台,即使您正在使用 IIS7 来管理您的主 IIS)。一旦您的本地计算机将电子邮件排队并且您无需等待它被发送,这将立即返回。也许更重要的是,如果发送错误,它将继续为您重试。信不信由你——有时 smtp.gmail.com 没有响应。

于 2013-02-07T22:32:19.893 回答