我们从我们的ASP.NET MVC3 Razor Web应用程序发送电子邮件。
目前我们使用的是ActionMailer.NET。
我已经看过MvcMailer了。
两者的问题都是它们需要一个Http上下文才能执行。
这样做的问题是我想异步发送电子邮件。现在我知道您可以异步执行实际的发送(例如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。
发布于 2012-05-30 15:24:19
你可以签出使用RazorViewEngine的postal:
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在将应用程序投入生产之前,还要确保您已经阅读并理解了dangers of implementing background tasks in ASP.NET applications。
发布于 2012-07-21 12:26:31
ActionMailer.NET现在可以在MVC之外独立使用。
详细信息在这里介绍
http://geeksharp.com/2011/07/06/actionmailer-0-6-released/
发布于 2013-02-08 06:32:20
如果你使用的是.NET 4.5 (或者Async CTP,不管它是什么),你可能想看看async ActionMethods。坦率地说,我不确定确切的需求是什么(MVC3/4),但这篇文章应该会有所帮助。
我也不知道你为什么这么关心数据库查找所花费的时间--它真的做了那么多吗?
比SendAsync更好的解决方案:我不喜欢使用SendAsync,而是使用常规的send through an SMTP server方法,比如我正在使用的方法(注意:即使您使用IIS7来管理您的主IIS,也必须使用IIS6控制台)。一旦你的本地机器将电子邮件排入队列,而你不需要等待它被发送,它就会立即返回。也许更重要的是,如果有错误发送,它将继续为您重试。信不信由你--有时smtp.gmail.com不会响应。
https://stackoverflow.com/questions/10811604
复制相似问题