Template Engineとは
SendGrid では、Template の管理機能を持っている。この機能を使うことにより、テンプレートの管理とアプリケーションを分離することができる。テンプレートの編集は、管理画面より行える。ちょっとした変更などがアプリのデプロイなしに、すぐに行えるのがメリット。
メールの文面考える人と、アプリ作る人が別で、もろもろ面倒くさいよー。という時に使うと良さそう。
この記事でやること
Ruby(2.2.3)を使ってSendGridのTemplate Engine機能を使う
使用するGems
テンプレートの編集
SendGrid Dashboard の左のメニューより、TEMPLATES
を選び、テンプレートを作成する。
テンプレート名は適当に。あとから変更することができる。
最初に提示されるテンプレートには、<%subject%>
, <%body%>
がある。これは、APIで送信する subject, body の内容に対応する。ただし、一部分だけ置き換えたメールを送りたいときに、アプリ側でテンプレート割り当ててbodyを作るのでは、ちょっと使い勝手が悪い(と個人的に思っている)。そこで、Substitute Tags を使う方向性とする。
<%subject%>
や<%body%>
タグを消したテンプレートは残念ながら保存できないので、文末などに置いておく。
保存すると、IDが生成される。このIDをメール送信時に利用することができる。
いざメール送信
ごく最近、SendGridのオフィシャルライブラリでは、AccessTokenに対応したので、その機能を使ってみる。
と思ったのだが、sendgrid-ruby
(1.0.1) を使おうとした時に、ちゃんとロードできない問題があった。PRを送って、取り込んでもらいました。(現状は修正済み)
source 'https://rubygems.org'
gem 'sendgrid-ruby'
gem 'smtpapi'
require 'sendgrid-ruby'
require 'smtpapi'
client = SendGrid::Client.new do |c|
c.api_key = ENV['SENDGRID_APIKEY']
end
# 送信先
to = ['kawahara@example.com']
header = Smtpapi::Header.new
# テンプレート有効化
header.add_filter('templates', 'enable', 1)
header.add_filter('templates', 'template_id', '916f4c70-563e-46ac-a4ca-5867f0a62591')
# 送信先を配列で指定
header.set_tos(to)
# 代替文字の設定 送信先と同じく配列で指定
header.add_substitution('-name-', ['kawahara'])
mail = SendGrid::Mail.new do |m|
m.to = to
m.from = 'noreply@example.com'
# subject と、text の指定は必須なのでとりあえずスペース。。これがちょっと嫌だなぁ
m.subject = ' '
m.text = ' '
m.smtpapi = header
end
result = client.send(mail)
p result.body
API KEYは、SendGridの設定メニューより発行できる。ついこないだのバージョン (0.0.3)までは、管理用のユーザ名・パスワードが必要だったが、それらの情報をアプリで共有する必要がなくなるので、より安全。
実行して送信を確認。
$ bundle install
$ SENDGRID_APIKEY=APIKEY bundle exec ruby sample.rb
来た。-name-
が kawahara に置き換わっている。
複数人に送りたい場合は、to の配送先を複数選び、同時に Substitution も配列で送る必要があるので要注意。
tos=['メールアドレスA', 'メールアドレスB']
, names=['a', 'b']
のような感じで対応付ける必要がある。
CC/BCCつきのメールでもやってみたりはしたのだが、Substitutionが置き換えられていないメールが来てしまった。。。これ、どうにかならんのですかね。。