LoginSignup
2
2

More than 5 years have passed since last update.

Mandrillのテンプレート管理ツール、mandrill-template-manager

Last updated at Posted at 2015-09-10

定型メールの送信に、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' な感じで。

ワークフロー

  1. 新規(generate)か、既存(export)を用いてテンプレートをローカルファイルとして管理開始
  2. テンプレートを変更したらコミット
  3. 本文プレビュー
  4. Mandrillにアップロード、現状Publish済みのものと差分があればわかるように表示
  5. ステータスを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

それぞれはテンプレートの管理画面で入力する内容になっています。

metadata.yml
---
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とします。

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でもつけておくのも良いかもしれない。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2