目次

目次

シンプルなレスポンシブE-mailを簡単に作るためのmjml

松木佑徒
松木佑徒
最終更新日2017/09/14 投稿日2017/09/14

新しいサービスを作っていてE-mailはカッコいいHTMLメールにしたいなと思ったのですが、 レスポンシブE-mailと言って全てのブラウザやスタイルが効かない場合も表示できるようにHTMLメールを作るにはすごく手間がかかるみたいです。 いろいろ調べるとメールクライアントやブラウザの違いなど色々を吸収しないといけないのである意味Webより大変な気もします。。

そのため、レスポンシブE-mailを作るには一般的なHTML(Webページ)と基本は一緒ですが専門の知識が必要で、 有名なCSS Frameworkの「Foundation」もE-mail用のフレームワークはWeb用フレームワークと別で用意されています。 http://foundation.zurb.com/emails.html

Foundation for Emailsは色々なレイアウトにも対応していて良いのですが、 Foundationユーザ以外には初期学習コストがあり少し敷居が高いのとレスポンシブE-mailのソースはHTMLで コンテンツに関係ない記述が多いため読みづらく結構メンテナンスが大変そうだったので、 簡単に作れるものを探したらmjmlというのが良かったので紹介です。 mjmlを使用したメールのサンプルはこちら

mjmlはReactのコンポーネントのセットでReactのコンポーネント(タグ)を組み合わせてHTMLを生成します。 “ となっている部分がReactのコンポーネントです。

<mjml>
  <mj-body>
    <mj-container>
      <mj-section background-color="#f0f0f0">
        <mj-column>
          <mj-text font-style="italic"
                   font-size="20"
                   color="#626262">
            My Company
          </mj-text>
        </mj-column>
      </mj-section>
      ...
    </mj-container>
  <mj-body>
<mjml>

mjmlにはmjml-cliというコマンドラインツールが用意されていて、これがmjml-coreを呼び出すことで mjmlタグを使用して書かれたHTMLをメールクライアントやブラウザの解釈できるHTML(レスポンシブE-mail)に変換してくれます。

npm install mjml
./node_modules/.bin/mjml input.mjml -o output.html

仕組みとしては以下のようになっているようです。

            mjml-cli
                ↓
            mjml-core
(入力HTML) -> (JSON) -> (出力HTML)

生成したHTMLを最終的に送信するときは 私はPythonを使用しているので生成後のHTMLをJinja2のテンプレートとして使用していますが、 node.jsであれば mjml-core をサーバーサイドに組み込むのも容易かと思います。

ちなみに上のHTMLをmjmlコマンドで変換すると以下のようになります。(メンテしたくないですね)

<!doctype html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office">
<head>
  <title></title>
  <!--[if !mso]><!-- -->
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <!--<![endif]-->
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<style type="text/css">
  #outlook a { padding: 0; }
  .ReadMsgBody { width: 100%; }
  .ExternalClass { width: 100%; }
  .ExternalClass * { line-height:100%; }
  body { margin: 0; padding: 0; -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; }
  table, td { border-collapse:collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt; }
  img { border: 0; height: auto; line-height: 100%; outline: none; text-decoration: none; -ms-interpolation-mode: bicubic; }
  p { display: block; margin: 13px 0; }
</style>
<!--[if !mso]><!-->
<style type="text/css">
  @media only screen and (max-width:480px) {
    @-ms-viewport { width:320px; }
    @viewport { width:320px; }
  }
</style>
<!--<![endif]-->
<!--[if mso]>
<xml>
  <o:OfficeDocumentSettings>
    <o:AllowPNG/>
    <o:PixelsPerInch>96</o:PixelsPerInch>
  </o:OfficeDocumentSettings>
</xml>
<![endif]-->
<!--[if lte mso 11]>
<style type="text/css">
  .outlook-group-fix {
    width:100% !important;
  }
</style>
<![endif]-->

<!--[if !mso]><!-->
    <link href="https://fonts.googleapis.com/css?family=Ubuntu:300,400,500,700" rel="stylesheet" type="text/css">
    <style type="text/css">

        @import url(https://fonts.googleapis.com/css?family=Ubuntu:300,400,500,700);

    </style>
  <!--<![endif]--><style type="text/css">
  @media only screen and (min-width:480px) {
    .mj-column-per-100 { width:100%!important; }
  }
</style>
</head>
<body>

  <div class="mj-container"><!--[if mso | IE]>
      <table role="presentation" border="0" cellpadding="0" cellspacing="0" width="600" align="center" style="width:600px;">
        <tr>
          <td style="line-height:0px;font-size:0px;mso-line-height-rule:exactly;">
      <![endif]--><div style="margin:0px auto;max-width:600px;background:#f0f0f0;"><table role="presentation" cellpadding="0" cellspacing="0" style="font-size:0px;width:100%;background:#f0f0f0;" align="center" border="0"><tbody><tr><td style="text-align:center;vertical-align:top;direction:ltr;font-size:0px;padding:20px 0px;"><!--[if mso | IE]>
      <table role="presentation" border="0" cellpadding="0" cellspacing="0">
        <tr>
          <td style="vertical-align:top;width:600px;">
      <![endif]--><div class="mj-column-per-100 outlook-group-fix" style="vertical-align:top;display:inline-block;direction:ltr;font-size:13px;text-align:left;width:100%;"><table role="presentation" cellpadding="0" cellspacing="0" width="100%" border="0"><tbody><tr><td style="word-wrap:break-word;font-size:0px;padding:10px 25px;" align="left"><div style="cursor:auto;color:#626262;font-family:Ubuntu, Helvetica, Arial, sans-serif;font-size:20px;font-style:italic;line-height:22px;text-align:left;">My Company</div></td></tr></tbody></table></div><!--[if mso | IE]>
      </td></tr></table>
      <![endif]--></td></tr></tbody></table></div><!--[if mso | IE]>
      </td></tr></table>
      <![endif]--></div>
</body>
</html>

Foundationも試したのですが綺麗に作るにはやはり多少学習コストがかかるので、 用意されているコンポーネントを覚えるだけのmjmlを使用した方が低コストでカッコいいHTMLメールが作れます。

細かいデザインの調整を行ったりレスポンシブE-mailについての知識が豊富な場合は良いと思いますが、 複雑なHTMLメールを作ったりする要件は少ないと思いますし、シンプルなレイアウトで済むのであれば このようなツールを使って生成する方がメリットは大きいかなと思います。

松木佑徒

目次