Существуют ли пакеты электронной почты MVC, для которых не требуется HTTP-контекст?

Мы отправляем электронные письма из нашего веб-приложения ASP.NET MVC 3 Razor.

В настоящее время мы используем 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.

3 ответа

ActionMailer.NET теперь можно использовать отдельно от MVC.

Подробности описаны здесь

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

Вы можете оформить заказ с использованием 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, прежде чем запускать ваше приложение в производство.

Если вы используете.NET 4.5 (или Async CTP, какой бы он ни был), вы можете рассмотреть асинхронные ActionMethods. Честно говоря, я не уверен, какие именно требования (MVC 3/4), но эта статья должна помочь.

Я также не уверен, почему вас так беспокоит время, затрачиваемое на поиск в базе данных - действительно ли он так много делает?

Лучшее решение, чем SendAsync: я предпочитаю не использовать SendAsync, а отправлять через SMTP-сервер с помощью обычного метода Send, например, используемого в IIS, который я и использую (Примечание: вы должны использовать консоль IIS6, даже если вы используете IIS7 для администрирования вашего основного IIS). Затем он сразу же вернется, как только ваш локальный компьютер поставит электронную почту в очередь, и вам не нужно ждать отправки. Возможно, еще важнее, если при отправке произошла ошибка, она будет повторять попытки для вас. Хотите верьте, хотите нет - иногда smtp.gmail.com не отвечает.

Другие вопросы по тегам