箱のプログラミング日記。

渋谷の自社開発企業でRails書いてます。

RailsでSendGridのAPIを使用する(4)【テンプレート】

f:id:y_hakoiri:20191102121704j:plain

※この記事は何回かに分けて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でメールを配信する方法をまとめてきました。長かった。。笑

最後少し駆け足になってしまいましたが、基本的に公式のガイドが充実していて(色んなところに書いてあって探してくるのが大変ではあるけど)、かつサポートもめちゃくちゃ対応が早いので本当に助かりました。

今後この記事が誰かの助けになると良いなと思います。

参考

github.com

SendGrid | メールを成功の原動力に。