Лучший способ отправки запланированной электронной почты в приложении.NET MVC3 с использованием MVCMailer

Я работаю над .NET MVC3 C# Application, Это приложение размещено на нашем собственном сервере. Теперь я хочу отправить запланированную электронную почту в моем приложении, например, ежедневно (в определенное время), еженедельно, ежемесячно и так далее...

В настоящее время я использую MVCMailer отправлять электронные письма в моем приложении.

Я старался Fluent Scheduler отправлять запланированные электронные письма, но это не работает с MVCMailer. Это работает хорошо, если я отправляю почту без MVCMailer и для других заданий планирования.

Это дает мне ОШИБКУ NULLReferenceException и говорит HTTPContext не может быть нулевым. Что я могу сделать, чтобы решить эту проблему.

Также предложите мне, какой будет лучший способ отправить электронную почту в моем заявлении.

  1. Служба Windows (Наличие собственного сервера)
  2. Планировщик (Fluent Scheduler)
  3. Запланированные задания SQL

Я присоединяю ERROR снимок:

2 ответа

Может случиться так, что MVCMailer зависит от HttpContext, который не будет существовать в вашем запланированном локальном потоке.

Вы можете отказаться от MvcMailer и внедрить собственное шаблонное решение. Что-то вроде RazorEngine ( https://github.com/Antaris/RazorEngine), который дает вам полную мощь Razor без необходимости запуска ontop в стеке Http. Вы по-прежнему можете получать ваши шаблоны с диска, чтобы ваши дизайнеры могли изменить его.

Затем вы можете отправить результаты по почте, используя стандартные классы, доступные в.net.

Например:

string template = File.ReadAllText(fileLocation);//"Hello @Model.Name, welcome to RazorEngine!";
string emailBody = Razor.Parse(template, new { Name = "World" });

SmtpClient client = new SmtpClient();
client.Host = "mail.yourserver.com";
MailMessage mm = new MailMessage();
mm.Sender = new MailAddress("foo@bar.com", "Foo Bar");
mm.From = new MailAddress("foo@bar.com", "Foo Bar");
mm.To.Add = new MailAddress("foo@bar.com", "Foo Bar");
mm.Subject = "Test";
mm.Body = emailBody;
mm.IsBodyHtml = true;
client.Send(mm);

Очевидно, вы могли бы очистить все это. Но это не займет много усилий, чтобы использовать приведенный выше код и создать несколько повторно используемых классов.:)

Поскольку у вас уже есть настроенный код FluentScheduler, я думаю, вы можете придерживаться этого. Windows-сервис тоже звучит привлекательно, однако я думаю, что это ваш звонок. Если вам нужен простой почтовый сервис, я не могу придумать причину, чтобы не делать это через FluentScheduler.


Я создал полный пример этого, доступного здесь: https://bitbucket.org/acleancoder/razorengine-email-example/src/dfee804d526ef3cd17fb448970fbbe33f4e4bb79?at=default

Вы можете скачать веб-сайт для локального запуска здесь: https://bitbucket.org/acleancoder/razorengine-email-example/downloads

Просто убедитесь, что изменили файл Default.aspx.cs, чтобы у вас были правильные данные почтового сервера.

Надеюсь это поможет.

Поскольку MVC Mailer лучше всего работает в стеке HTTP (т. Е. С контроллеров), я обнаружил, что очень надежный способ сделать это - использовать Windows Task Schedule с какого-либо сервера. Вы даже можете раскрутить микроэкземпляр на Amazon Web Server.

Используйте "curl" для вызова URL вашего контроллера, который выполняет работу и отправляет электронные письма.

Просто настройте запланированную задачу (или Cron, если вы хотите использовать *IX) для вызова "c: \ path_to_curl \ curl.exe http://yourserver.com/your_controller/your_action".

Вы даже можете запустить сервер * IX на AWS, чтобы сделать его еще дешевле.

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