Существуют ли какие-либо пакеты электронной почты 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.

Ответ 1

Вы можете проверить postal, который использует RazorViewEngine:

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

        return View();
    }
}

и внутри ~/Views/Emails/Example.cshtml:

To: @ViewBag.To
From: [email protected]
Subject: Important Message

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

Также убедитесь, что вы прочитали и поняли опасность выполнения фоновых задач в приложениях ASP.NET перед тем, как поставить свою заявку на производство.

Ответ 3

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

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

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