sendgridでメールの一斉配信をする際に宛先ごとに異なる文字列を仕込む方法

こんにちは!kossyです!




さて、今回はsendgridでメールの一斉配信をする際に宛先ごとに異なる文字列を仕込む方法について、ブログに残してみたいと思います。




環境
Ruby 2.6.9
Rails 6.0.4




X-SMTPAPIの Substitution Tags を使う

以下のドキュメントによると、

sendgrid.kke.co.jp

宛先ごとに「ようこそ!◯◯様」などといった形で宛名やその他様々な属性値をメール本文などに埋め込みたい場合、Substitution Tagsが利用できます。
次のように、「sub」パラメータで置換キー(-name-)と宛先毎の置換文字列([“Alice”,”Bob”])を配列で指定します。
配列の順序は「to」パラメータで指定した宛先配列の順序と対応づいています。

{
  "to" : [
    "alice@test.com",
    "bob@test.com"
  ],
  "sub": {
    "-name-": [
      "Alice",
      "Bob"
   ]
}

一方、メール本文には置換したい箇所に置換キーを埋め込みます。

ようこそ!-name-様

こうすることで、このリクエストはSendGridで処理され、宛先ごとに分解された上で、置換キーが宛先ごとに対応する文字列で置き換えられます。
また、Section Tagsを利用することでより高度な置換処理を指定することもできます。

出典: https://sendgrid.kke.co.jp/blog/?p=4232

との記載がありますので、この機能を使えば宛先ごとに異なる文字列をメール本文に挿入することができそうです。

Railsの場合ですと、以下のようなコードを記述すればOKです。

  def send_mail
    users = User.all

    emails = users.pluck(:email)
    names = users.pluck(&:full_name)

    xsmtp_api_params = { to: emails, sub: { "-name-": names } }
    headers['X-SMTPAPI'] = JSON.generate(xsmtp_api_params)

    mail(to: emails, subject: subject)
  end

置換コードである「-name-」はerbテンプレートに仕込んでおきます。

<p>ようこそ! -name- 様</p>

これで宛先ごとに異なる文字列をメール本文内に挿入することができます。


まとめ

メールの一斉配信の際に宛先ごとに異なる文字列を仕込めるのは便利っちゃ便利なんですが、パラメータの指定を間違えたりすると重大なインシデントにつながってしまうので、

誤りの入り込まないパラメータ構築を行う必要がありそうですね。。。