定型メールの送信に、MailChimpさんとこのMandrillを使おうとしています。アプリでそれぞれメールのテンプレートを持たないで済むかなと。
で、Mandrill上のテンプレートをバージョン管理に乗せるため、ツールを一個書きました。
Rubygems配布もしてます。
インストール
基本は単品で動きますが、ついでに入れておくと良いGemsと一緒に使うと良いです。
gem 'mandrill-template-manager'
## 入れておくと使われる、表示成形用のGem達
gem 'formatador', github: 'geemus/formatador' # マルチバイト補正アリバージョン
gem 'unicode'
## テンプレートにHandlebarsを使う場合、ローカルプレビューもしたいときに追加。
# gem 'handlebars'
bundle install --binstubs --path vendor/bundleなどとして、../bin/mandrilltemplateで実行できるようにしておくと楽です。
APIキーは環境変数へ。 export MANDRILL_APIKEY='your api key' な感じで。
ワークフロー
- 新規(generate)か、既存(export)を用いてテンプレートをローカルファイルとして管理開始
 - テンプレートを変更したらコミット
 - 本文プレビュー
 - Mandrillにアップロード、現状Publish済みのものと差分があればわかるように表示
 - ステータスをPublishへ
 
このへんはcodenize.toolsの影響を多分に受けています。
Mandrillのテンプレートは単に変更するだけならDraft扱いなので、--dry-runの変わりとしてプレビュー(render)をつけました。
WebのUIからならドラフトを元にしたテスト送信もできるのですが、APIには無いのかな?見つからなかった。
やってみよう
では今あるテンプレートをバージョン管理に移行して、更新してみる。
Mandrill上にあるテンプレートをエクスポート
まずはmandrilltemplate listでMandrill上にあるテンプレートと、ローカル(リポジトリ)にあるテンプレートの一覧を確認する。
 $ mandrilltemplate list
Remote Templates
----------------------
  +----------+-------------------+---------------------+-------------------+------------+--------------------+--------+
  | has_diff | name              | slug                | from_email        | from_name  | subject            | labels |
  +----------+-------------------+---------------------+-------------------+------------+--------------------+--------+
  |          | example           | example             | test@example.com  | Boss       | ようこそ           | []     |
  +----------+-------------------+---------------------+-------------------+------------+--------------------+--------+
Local Templates
----------------------
  +------+------+------------+-----------+---------+--------+
  | name | slug | from_email | from_name | subject | labels |
  +------+------+------------+-----------+---------+--------+
  +------+------+------------+-----------+---------+--------+
mandrilltemplate listは-vオプションでリモートを詳細表示にできます。
リモートにexampleというテンプレートがあるね。ローカルにはまだ何もないです。
これをmandrilltemplate exportする。
$ mandrilltemplate export example
      create  templates/example
      create  templates/example/metadata.yml
      create  templates/example/code
      create  templates/example/text
それぞれはテンプレートの管理画面で入力する内容になっています。
---
slug: example
labels: []
subject: "ようこそ"
from_email: test@example.com
from_name: Boss
codeの中身はHandlebarsのテンプレートを使いました。
<div>
おはよう {{UserName}} くん。<br/>
今日の指令は...<br/>
{{#each ImpossibleMissions}}
  <ul>
    <li>{{this}}</li>
  </ul>
{{/each}}
というわけだ、よろしくやってくれたまえ。<br/>
なお、このメールは自動的に消滅する。検討を祈る。
</div>
textは今回はカラッポなので省略。
そうするとこれがローカルのテンプレートとして検出されるようになります。name=ディレクトリ名なので、変更に注意。
$ mandrilltemplate list
...
Local Templates
----------------------
  +---------+---------+------------------+-----------+----------+--------+
  | name    | slug    | from_email       | from_name | subject  | labels |
  +---------+---------+------------------+-----------+----------+--------+
  | example | example | test@example.com | Boss      | ようこそ   | []     |
  +---------+---------+------------------+-----------+----------+--------+
メールを変更してupload
では本文を更新してみます。
$ git diff
diff --git a/templates/example/code b/templates/example/code
index fa21456..a365622 100644
--- a/templates/example/code
+++ b/templates/example/code
@@ -10,4 +10,6 @@
 というわけだ、よろしくやってくれたまえ。<br/>
 
 なお、このメールは自動的に消滅する。検討を祈る。
-</div>
\ No newline at end of file
+
+あと、帰りに大根買ってきて。
+</div>
mandrilltemplate uploadでアップします。
APIの戻りを丸々出力していますがまあ気にしないで。
$ mandrilltemplate upload example
---
slug: example
name: example
code: |-
  <div>
  おはよう {{UserName}} くん。<br/>
  今日の指令は...<br/>
  {{#each ImpossibleMissions}}
    <ul>
      <li>{{this}}</li>
    </ul>
  {{/each}}
  というわけだ、よろしくやってくれたまえ。<br/>
  なお、このメールは自動的に消滅する。検討を祈る。
  あと、帰りに大根買ってきて。
  </div>
publish_code: |-
  <div>
  おはよう {{UserName}} くん。<br/>
  今日の指令は...<br/>
  {{#each ImpossibleMissions}}
    <ul>
      <li>{{this}}</li>
    </ul>
  {{/each}}
  というわけだ、よろしくやってくれたまえ。<br/>
  なお、このメールは自動的に消滅する。検討を祈る。
  </div>
published_at: '2015-09-10 05:50:37'
created_at: '2015-09-09 03:34:47.89299'
updated_at: '2015-09-10 06:06:27.13888'
draft_updated_at: '2015-09-10 05:50:37'
publish_name: example
labels: []
text: 
publish_text: 
subject: "ようこそ"
publish_subject: "ようこそ"
from_email: test@example.com
publish_from_email: test@example.com
from_name: Boss
publish_from_name: Boss
アップロードしたら、has_diffパラメータがtrueを持ちました。
DraftとPublishdに違いがあったらここに表示されます。
$ mandrilltemplate list -v
Remote Templates
----------------------
  +----------+-------------------+---------------------+-------------------+------------+--------------------+--------+
  | has_diff | name              | slug                | from_email        | from_name  | subject            | labels |
  +----------+-------------------+---------------------+-------------------+------------+--------------------+--------+
  | true     | example           | example             | test@example.com  | Boss       | ようこそ           | []     |
  +----------+-------------------+---------------------+-------------------+------------+--------------------+--------+
...
プレビューしてみる
DraftはWebUIからテスト送信できます。ただ、ローカルに同じ内容を持っているのでCLIで本文くらいはプレビューできるようにしておきました。
まずは先ほどのテンプレートに適用するパラメータファイルを用意しましょう、merge_vars.jsonとします。
[
  {
    "name": "UserName",
    "content": "ExampleUser"
  },
  {
    "name": "ImpossibleMissions",
    "content": [
      "Mission A",
      "Mission B",
      "Mission C"
    ]
  }
]
今回のテンプレートをプレビューするにはmandrilltemplate render --handlebarsで。
$ mandrilltemplate render --handlebars example templates/example/merge_vars.json 
<div>
おはよう ExampleUser くん。<br/>
今日の指令は...<br/>
  <ul>
    <li>Mission A</li>
  </ul>
  <ul>
    <li>Mission B</li>
  </ul>
  <ul>
    <li>Mission C</li>
  </ul>
というわけだ、よろしくやってくれたまえ。<br/>
なお、このメールは自動的に消滅する。検討を祈る。
あと、帰りに大根買ってきて。
</div>
プレビュー良好ですね。
デフォルトはAPIのrenderメソッド(mailchimpフォーマット)を使ってレンダリングします。
しかしHandlebarsを使っている場合はAPIのrenderできないので、とりあえずローカルのRubyで処理することにしました。
--handlebarsオプションを渡して動作を切り替えます。
Publishして本番適用
色々と気が済んだらmandrilltemplate publishして本番適用です。
$ mandrilltemplate publish example
これでdraft状態のテンプレートがpublishedになりました。
おわりに
コードなので何かしらCIと連携することができます。
たとえばCircleCIならアーティファクトとしてファイルに書きだすなり、パイプでメールを実際に送信したらよさそう。Publishへの変更を自動でやるかはお好みで。
なお、Mandrill上に実際にあるテンプレートがいつのものかは日付から判断するしか無いので、もうちょい厳密に見るならばlabelにgitのsha1でもつけておくのも良いかもしれない。