Лучший способ отправки запланированной электронной почты в приложении.NET MVC3 с использованием MVCMailer
Я работаю над .NET MVC3 C# Application
, Это приложение размещено на нашем собственном сервере. Теперь я хочу отправить запланированную электронную почту в моем приложении, например, ежедневно (в определенное время), еженедельно, ежемесячно и так далее...
В настоящее время я использую MVCMailer
отправлять электронные письма в моем приложении.
Я старался Fluent Scheduler
отправлять запланированные электронные письма, но это не работает с MVCMailer. Это работает хорошо, если я отправляю почту без MVCMailer и для других заданий планирования.
Это дает мне ОШИБКУ NULLReferenceException
и говорит HTTPContext
не может быть нулевым. Что я могу сделать, чтобы решить эту проблему.
Также предложите мне, какой будет лучший способ отправить электронную почту в моем заявлении.
- Служба Windows (Наличие собственного сервера)
- Планировщик (Fluent Scheduler)
- Запланированные задания 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, чтобы сделать его еще дешевле.