【问题标题】:Are there any MVC Email Packages That Don't Require a HTTP Context?是否有任何不需要 HTTP 上下文的 MVC 电子邮件包?
【发布时间】:2012-06-04 09:53:08
【问题描述】:

我们从我们的 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”方法中,我再次查询数据库,执行其他操作等......我希望所有这些都是异步的 - 因此整个调用都包含在一个任务中,而不是仅仅执行 @987654323 @。希望这是有道理的。

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

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

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

【问题讨论】:

标签: asp.net-mvc-3 razor actionmailer html-email mvcmailer


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    这里有详细介绍

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

    【讨论】:

    • 注意:某些 razor 功能无法使用,例如 Partials - 这对我来说不好:-(
    【解决方案3】:

    您可以查看使用 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

    【讨论】:

    • 那你有什么建议呢?单独的电子邮件服务会很棒,但实际上它需要是单独的 MVC Web 应用程序,以便使用 razor 视图引擎和我的域/存储库 - 不是吗?然后,我最终只是对那个“网站”进行 HTTP 调用以发送电子邮件。你会怎么做?
    • 您可以在 Windows 服务中使用 RazorEngine 包,它允许您在 ASP.NET MVC 应用程序之外呈现 Razor 视图。
    • 如果我需要访问主站点的路由表以生成指向它的链接怎么办?我是否必须以某种方式将路由表抽象为一个通用程序集?
    • 我的一个同事有一个想法,这有点狡猾,但它会起作用。我在当前应用程序中创建了一个“秘密”路由。在我通常调用 ActionMailer 的控制器中,我使用异步 Web 客户端对这个秘密 URL 执行“POST”(我可以传递秘密标头以确保安全),然后该 URL 映射一个发送电子邮件的控制器。基本上“伪造”一个应用程序内的服务。想法?
    猜你喜欢
    • 1970-01-01
    • 2015-08-15
    • 2011-04-02
    • 2011-02-11
    • 1970-01-01
    • 1970-01-01
    • 2017-02-27
    • 2015-03-15
    • 2019-02-28
    相关资源
    最近更新 更多