RazorEngineでHTMLメールとテキストメールのテンプレートを作成する。

RazorEngineを使ったメールテンプレート作成方法。

antaris.github.io

テンプレートに埋め込むモデルを定義する。

namespace MailApp.Models.Mail
{
    public class Template
    {
        public string Name { get; set; }
    }
}

テンプレートファイルを指定して、その中身をすべて読み込む。

var templateTextPath = "~/MailTemplates/template.txt";
var templateHtmlPath = "~/MailTemplates/template.cshtml";

// テンプレート読み込み
var templateText = File.ReadAllText(HttpContext.Current.Server.MapPath(templateTextPath));
var templateHtml = File.ReadAllText(HttpContext.Current.Server.MapPath(templateHtmlPath));

テンプレートファイルの中身は以下の通り。まずはテキストメール用。

@Model.Name さん
こんにちは!

次はHTMLメール用。

<html>
<head>
  <title>bizsky ボックス</title>
  <style>
  <!--
    '@'マークを使うときは'@@'と記述する。
  -->
  </style>
</head>
<body>
  <div>@Model.Name さん</div>
  <div>こんにちは!</div>
</body>
</html>

テンプレートをRazorEngineに追加してコンパイルする。

// テンプレート作成
var service = Engine.Razor;
service.AddTemplate("templateHtml", templateHtml);
service.Compile("templateHtml", typeof(Template));
service.AddTemplate("templateText", templateText);
service.Compile("templateText", typeof(Template))

テンプレートにモデルを埋め込んで結合する。

var htmlBody = service.Run("templateHtml", typeof(Template), new Template { Name = "Taro Yamada" });
var textBody = service.Run("templateText", typeof(Template), new Template { Name = "Taro Yamada" });


スタイルを「@Styles.Render()」で埋め込みたかったが対応していないようだ。