※この記事は何回かに分けてRailsでセンドグリッドAPIを使用する方法をまとめたものです。
アカウント発行〜有料プラン契約までの導入編はこちら
RailsでSendGridのAPIを使用する(1)〜導入〜 - 箱のプログラミング日記。
APIキーの発行やDNSへのレコード登録など準備編はこちら
RailsでSendGridのAPIを使用する(2)〜準備〜 - 箱のプログラミング日記。
gemのインストール〜APIでメール送信までの実装編はこちら
RailsでSendGridのAPIを使用する(3)〜実装〜 - 箱のプログラミング日記。
今回はセンドグリッドで使用できるテンプレートについてまとめます。
SendGridのテンプレート
センドグリッドでは配信メールのテンプレートを登録しておくことができます。
用途に合わせてテンプレートを作成しておけるので、アプリケーション側でテンプレートを作成する必要がなく、メール配信時にデータを渡すことでテンプレート内部の文章を動的に作成することもできます。
さらに言うとテンプレートごとにバージョン管理もできるらしい。めちゃくちゃ便利。
テンプレートの種類
以下の2種類があります。
- Legacy Template
- Transactional Template
詳しくは以下の公式を参照してもらいたいのですが、Legacy Templateは元々あった方、Transactional Templateは後から追加された方です。
Transactional Templateの方がif文を使用した条件分岐だったり、繰り返し処理だったり、動的なテンプレートを作成するのに向いていて便利だそう。
テンプレート機能の運用例のご紹介 | SendGridブログ
実際に使ってみる
こちらも公式に詳しく載っています。
テンプレートを適用して送信する(Dynamic Transactional Template編) - ドキュメント | SendGrid
簡単な流れとしては、
- センドグリッドのダッシュボードでテンプレートを作成
- 作成したテンプレートの「テンプレートid」をコピー
- アプリケーション側からセンドグリッドでメール配信をするときにパラメーターにテンプレートidを含ませる
こんな感じ。
テンプレートidをパラメーターで渡す
前回の記事ではsendgrid-ruby公式から引っ張ってきた以下のコードでメール送信を実現したけど↓
class MailMagazine < ActiveRecord::Base require 'sendgrid-ruby' include SendGrid def self.deliver_mail_magazine from = SendGrid::Email.new(email: '送信元アドレス') to = SendGrid::Email.new(email: '送信先アドレス') subject = '件名' content = SendGrid::Content.new(type: 'text/plain', value: 'テスト配信です') mail = SendGrid::Mail.new(from, subject, to, content) sg = SendGrid::API.new(api_key: ENV['SENDGRID_API_KEY']) response = sg.client.mail._('send').post(request_body: mail.to_json) end end
パラメーターにテンプレートidを含めたい場合は
mail.template_id = ENV['SENDGRID_TEMPLATE_ID']
mailオブジェクトにtemplate_id
属性を指定する必要がある。(今回は環境変数に置いた)
テンプレートの中身を動的に変更したい
ガチガチに固めた(?)テンプレートじゃなくて、送信先によって宛名を変えたり、送る内容によって本文を変えたいことは良くあるはず。
そんな時はテンプレート側で{{変数名}}
としておき、パラメーターでその変数に対応する値を渡してあげればOK。
def self.deliver_mail_magazine mail = Mail.new mail.from = Email.new(email: 'fuga@gmail.com', name: 'fuga') personalization = Personalization.new personalization.add_to(Email.new(email: 'hoge@gmail.com')) personalization.add_dynamic_template_data( subject: '件名だよ', name: 'hogeさま', body: 'テスト送信だよ' ) mail.add_personalization(personalization) mail.template_id = ENV['SENDGRID_TEMPLATE_ID'] sg = SendGrid::API.new(api_key: ENV['SENDGRID_API_KEY']) sg.client.mail._('send').post(request_body: mail.to_json) end
この場合はadd_dynamic_template_data
でデータを渡す必要があるためちょっと修正。
もちろんこの部分はRailsのデータベースと紐づけることもできるので
user = User.find(1) . . . personalization.add_dynamic_template_data( subject: "#{user.name}様にお得なお知らせ", name: "#{user.name}" )
みたいなこともできる。非常に便利。
まとめ
4回に分けてSendGridでメールを配信する方法をまとめてきました。長かった。。笑
最後少し駆け足になってしまいましたが、基本的に公式のガイドが充実していて(色んなところに書いてあって探してくるのが大変ではあるけど)、かつサポートもめちゃくちゃ対応が早いので本当に助かりました。
今後この記事が誰かの助けになると良いなと思います。