剃刀视图作为电子邮件模板

53

我正在mvc3中创建一个电子邮件引擎,尝试使用Razor视图作为电子邮件模板。据说这是可能的,但我还没有找到任何相关信息。


https://scottsauber.com/2018/07/07/walkthrough-creating-an-html-email-template-with-razor-and-razor-class-libraries-and-rendering-it-from-a-net-standard-class-library/ - Ragesh S
5个回答

63

你可以使用http://razorengine.codeplex.com/来实现这个功能。它允许您在MVC之外使用Razor。

string Email = "Hello @Model.Name! Welcome to Razor!";
string EmailBody = Razor.Parse(Email, new { Name = "World" });

它很容易实现,并且可以在http://nuget.codeplex.com/上获取,以便轻松集成到您的项目中。


我一定会去看看@BuildStarted。不过有一个问题:如果我理解正确,这不是默认内置在Razor中的吗? - sTodorov
看起来很不错。不过还有一个问题:您是否仍然可以使用*.cshtml“页面”作为模板? - sTodorov
不,它并不是默认内置在Razor中的。这是个好问题。虽然我确信它可以通过Razor处理cshtml页面,但它并不直接支持它,因此您需要添加一个额外的模板来支持诸如@Html功能之类的特性。可能值得在codeplex页面上请求该支持。虽然MVC有自己的Razor解析器,但它实际上是与Razor本身分离的,所以我不确定是否可以轻松地完成。 - Buildstarted
感谢@BuildStarted - 这是一个非常有用的工具/库,特别是在处理电子邮件的Windows服务中使用。 - HenningK
1
你把cshtml模板放在哪里?放在资源文件夹里吗? - Tomas Kubes
显示剩余2条评论

27

您可以使用模板文件作为Razor电子邮件正文模板。您可以使用任何扩展名,因为您可以在 .Net 中将文件加载为文本。让我们使用以下示例作为模板:

Hello @Model.Name,

Welcome to @Model.SiteName!

Regards,
Site Admins

将该文件保存为类似于“WelcomeMessage.cshtml”、“WelcomeMessage.template”等的名称。在“解决方案资源管理器”中选择该文件,在属性窗口中选择“输出目录”并选择“始终复制”。唯一的缺点是,该模板必须随应用程序一起使用,并且不能编译为类。

现在,我们想将它解析为一个字符串,以便分配给邮件消息正文。Razor会获取模板和模型类,然后解析它们,最后返回一个包含所需值的字符串。 您需要在应用程序中添加RazorEngine软件包,可以在NuGet中找到它。下面是一个简短的代码示例,以说明如何使用:

using System.IO;
using RazorEngine;

// ...
MyModel model = new MyModel { Name = "User", SiteName = "Example.com" };
string template = File.OpenText("WelcomeMessage.template").ReadToEnd();
string message = Razor.Parse(template, model);

这与其他答案类似,但展示了从文本文件中快速加载模板的方法。


13

你或许应该考虑使用MvcMailer。如果你还没有在MVC中使用RazorEngine,那么它非常好用(我已经在WebForms上成功地使用过它),但如果你已经使用了MVC,那么你也可以利用它。

(来源:Hanselmen的NuGet每周推荐2)


3
请注意,MvcMailer需要一个HttpContext,这就是为什么非MVC用户使用RazorEngine是个好选择,或者如果您计划从后台任务发送电子邮件的原因。 - Dunc

4
你可以使用NuGet中的Essential Mail: Razor包。它是基于RazorEngine构建的,并提供了简单的电子邮件渲染界面。
电子邮件消息模板大致如下:
@inherits Essential.Templating.Razor.Email.EmailTemplate
@using System.Net;
@{
    From = new MailAddress("example@email.com");
    Subject = "Email Subject";
}
@section Html 
{
   <html>
      <head>
          <title>Example</title>
      </head>
      <body>
          <h1>HTML part of the email</h1>
      </body>
   </html>
}
@section Text 
{
    Text part of the email.
}

在GitHub上阅读更多:https://github.com/smolyakoff/essential-templating/wiki/Email-Template-with-Razor


0

如有必要,披露说明是我正在维护/工作的内容。 - Nick Josevski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接