我正在尝试在我的MVC项目中发送格式化的电子邮件。我在BaseService类中使用此方法完美地发送了正常的电子邮件,其他所有服务都继承自:
public void SendAsyncEmail(MailMessage message)
{
var client = new SmtpClient("smtp.gmail.com", 587)
{
Credentials = new NetworkCredential("cred", "password"),
EnableSsl = true
};
client.SendCompleted += (s, e) =>
{
client.Dispose();
message.Dispose();
};
ThreadPool.QueueUserWorkItem(o => client.SendAsync(message, Tuple.Create(client, message)));
}
现在,我需要将每个MailMessage.Body转换为HTML页面,而不是纯文本主体,理想情况是使用Razor模板。我找到了MVCMailer:
https://github.com/smsohan/MvcMailer/wiki/MvcMailer-Step-by-Step-Guide
我安装了它,搭建了一些模板,并在我的BaseService中添加了以下内容:
public virtual MvcMailMessage Welcome()
{
ViewBag.Name = "Test";
return Populate(x =>
{
x.viewName = "Welcome";
x.To.Add("sohan39@example.com");
});
}
但是我的服务没有HTTPContext,因此ViewBag没有解析(也没有填充)。
最简单的方法是什么?
答案 0 :(得分:1)
你对Razor和MVC Views感到困惑。 Razor只是一种模板语言,它本身并没有HttpContext的概念,也不应该。视图在请求周期中接收HttpContext,因为它是一个Web请求,但如果您在请求周期之外使用Razor,那么您没有。因此,最简单的解决方案就是不使用ViewBag。就个人而言,我会说建议应该适用于,即使你确实拥有HttpContext ,但这不是重点。
我对MvcMailer并不过分熟悉;我自己使用邮政。但是,我相信校长基本相同。您将模型或对象传递到邮件呈现中,然后您可以在视图中访问该数据。因此,不要使用ViewBag,而是直接传递数据。如果MvcMailer没有能力将任意数据添加到其视图上下文中(我会发现令人惊讶),那么请尝试使用Postal。使用Postal,您可以使用您喜欢的任何数据创建Postal.Email
的子类。它的功能类似于视图模型。然后,您可以强烈键入此模型的视图,并在视图中使用它,并提供完整的智能感知支持。如果您需要操作中的某些信息,只需将其传递给视图的模型:simple。