使用MVCMailer在.NET MVC3应用程序中发送预定电子邮件的最佳方式

时间:2013-12-06 07:21:00

标签: asp.net-mvc-3 scheduled-tasks mvcmailer

我正在开发 .NET MVC3 C# Application 。此应用程序托管在我们自己的服务器上。 现在我想在我的应用程序中发送预定电子邮件,例如每天(在特定时间),每周,每月等等...

目前我正在使用 MVCMailer 在我的应用程序中发送电子邮件。

我尝试 Fluent Scheduler 发送预定的电子邮件,但不适用于MVCMailer 。如果我发送没有MVCMailer的邮件和其他调度工作,它可以正常工作。

它给了我一个错误NULLReferenceException,并说HTTPContext不能为空。 我该怎么做才能解决这个问题。

还建议我在我的应用程序中发送电子邮件的最佳方式。

  1. Windows服务(拥有自己的服务器)
  2. 计划程序(流利计划程序)
  3. SQL计划作业
  4. 我正在附加ERROR快照: enter image description here enter image description here

2 个答案:

答案 0 :(得分:1)

可能是MVCMailer依赖于HttpContext,它不会存在于您计划的threadlocal中。

您可以考虑废弃MvcMailer并实施自己的模板解决方案。像RazorEngine(https://github.com/Antaris/RazorEngine)之类的东西,它可以为你提供Razor的全部功能而无需在Http堆栈上运行ontop。您仍然可以从磁盘中获取模板,以便设计人员可以对其进行修改。

然后,您可以使用.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文件即可获得正确的邮件服务器详细信息。

希望这有帮助。

答案 1 :(得分:0)

由于MVC Mailer在HTTP堆栈中运行得最好(即来自控制器),我发现实现这一目标的一种非常可靠的方法是使用某个服务器上的Windows任务计划。您甚至可以在Amazon Web Server上启动微实例。

使用“curl”调用执行工作的控制器的URL并发送电子邮件。

只需设置一个预定任务(如果你想使用* IX,就设置Cron)来调用“c:\ path_to_curl \ curl.exe http://yourserver.com/your_controller/your_action”。

您甚至可以在AWS上启动* IX服务器以使其更便宜。