Существуют ли какие-либо пакеты электронной почты 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 перед тем, как поставить свою заявку на производство.
Ответ 2
ActionMailer.NET теперь может использоваться автономно вне MVC.
Подробности здесь описаны
http://geeksharp.com/2011/07/06/actionmailer-0-6-released/
Ответ 3
Если вы используете .NET 4.5 (или Async CTP, что бы это ни было), вы можете посмотреть в async ActionMethods. Чтобы быть откровенным, я точно не знаю, какие требования (MVC 3/4), но эта статья должна помочь.
Я также не уверен, почему вас беспокоит время, затраченное на поиск базы данных - действительно ли это так много?
Лучшее решение, чем SendAsync:
Я предпочитаю не использовать SendAsync, а отправлять через SMTP-сервер с помощью обычного метода отправки, например, в IIS, m (Примечание: вы должны использовать консоль IIS6, даже если вы используете IIS7 для администрирования основного IIS). Затем это произойдет немедленно, как только ваш локальный компьютер поставит в очередь письмо, и вам не нужно ждать его отправки. Возможно, что более важно, если сообщение об ошибке будет продолжено для вас. Верьте или нет - иногда smtp.gmail.com не отвечает.