Существуют ли пакеты электронной почты 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.
Подробности описаны здесь
Вы можете оформить заказ с использованием 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 не отвечает.