我正在开发 .NET MVC3 C# Application
。此应用程序托管在我们自己的服务器上。
现在我想在我的应用程序中发送预定电子邮件,例如每天(在特定时间),每周,每月等等...
目前我正在使用 MVCMailer
在我的应用程序中发送电子邮件。
我尝试 Fluent Scheduler
发送预定的电子邮件,但不适用于MVCMailer 。如果我发送没有MVCMailer的邮件和其他调度工作,它可以正常工作。
它给了我一个错误NULLReferenceException
,并说HTTPContext
不能为空。
我该怎么做才能解决这个问题。
还建议我在我的应用程序中发送电子邮件的最佳方式。
我正在附加ERROR
快照:
答案 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服务器以使其更便宜。