これまではマーケティングメールでしか使えなかったテンプレートが、トランザクションメールでも使えるようになって早数か月。やっといい感じの使い方を理解できたのでまとめます。
Transactional Email Template Engine | SendGrid
既に翻訳されているので、Template Engine についてはブログを読んでもらう方がわかりやすいです。
新機能 Template Engine リリースのお知らせ | ブログ | SendGrid
あと、チュートリアルも翻訳されているので一通り目を通しておくのが吉かと。
Template Engine チュートリアル | ブログ | SendGrid
Template Engine はかなり期待していたにもかかわらず、全然使ってなかった理由が Subject や Body の扱いがいまいちだと思ったからです。特にチュートリアルでは -name- 変数をわざわざ渡していたり、正直いまいちとしか思えません。
久しぶりに Template Engine の FAQ を読むと、ブランクでも問題無いとあったので改めて使ってみました。
テンプレートの置換タグ(body/subject)に渡す変数がない場合はどうしたらいいでしょうか?
よくある質問 – Template Engine編 | ブログ | SendGrid
必ずしも変数を指定する必要はないので、メール送信時に body や subject にブランクを渡してください。
変数を指定する必要はないですが、テンプレート中には subject / body が無いとエラーになります。
とりあえずテンプレートを管理画面から作ります。Template ID は SMTP API で必要になります。
テンプレートはバージョン管理を行うことが可能で、ちょっとしたミスは編集で対応して大きくデザインを変える場合にはバージョンを追加と言うように、効率的に管理が出来るのが良いですね。
編集機能も結構優秀で、基本的な書式の設定や画像とリンクの挿入など簡単にデザイン出来ます。
これまではサービス専用の管理画面でメールテンプレートを弄ることが多かったと思いますが、Template Engine を使えば Template ID と変数だけアプリが分かっていれば、後は SendGrid に丸投げ出来て便利です。
このままだと HTML メール受信環境じゃない場合に空っぽになってしまうので、テキスト版も作成します。
切り替えたタイミングで上のようなポップアップが表示されるので、殆どの場合は "Import From HTML" を選べば問題ないでしょう。これだけで HTML 版からテキスト版を自動で作成してくれます。
これでテンプレートの準備は出来たので、実際に SMTP API を使ってメールを送信してみます。変数を活用する関係で公式クライアントを使わずに試しました。*1
var credentials = new NetworkCredential("ApiUser", "ApiKey"); var client = new SendGridClient(credentials); var message = new SendGridMessage(); message.To.Add("********@gmail.com"); message.From = "info@shibayan.jp"; message.Subject = " "; message.Text = " "; message.Html = " "; message.UseTemplateEngine("91ba5fd7-984c-4810-95fd-030be7242106"); message.Header.AddSubstitution("-name-", "抱かれたい男 No.1"); message.Header.AddSubstitution("-url-", "http://buchizo.wordpress.com/"); client.Send(message);
最初に違和感を持つと思うのが Subject / Text / Html に空文字列ではなくスペースを入れている部分だと思います。FAQ ではブランクで良いとありましたが、実際に試すと空文字列だとエラーになったので妥協しました。この挙動は修正してもらいたいですね。
UseTemplateEngine で渡しているのは管理画面にあった Template ID です。それ以外は AddSubstitution で変数を設定しているぐらいですね。
これで送信すると以下のようにテンプレートが使われた形でメールが届きます。
モデルとビューを綺麗に分けることが出来るので、Template Engine は使うべき機能だと実感しました。