可能是 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 文件以获取正确的邮件服务器详细信息。
希望这可以帮助。