1

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

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

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

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

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

  1. Windows 服务(拥有自己的服务器)
  2. 调度器(流利的调度器)
  3. SQL 计划作业

我附上ERROR快照: 在此处输入图像描述 在此处输入图像描述

4

2 回答 2

1

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

您可以考虑废弃 MvcMailer 并实施您自己的模板解决方案。类似于 RazorEngine ( https://github.com/Antaris/RazorEngine ),它为您提供 Razor 的全部功能,而无需在 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 文件以获取正确的邮件服务器详细信息。

希望这可以帮助。

于 2013-12-06T09:59:40.827 回答
0

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

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

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

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

于 2013-12-22T22:42:00.700 回答