📧

SendGrid API と自社アプリを連携させる方法(実装編)

2023/11/29に公開

はじめに

こんにちは、ラブグラフのエンジニアのDaichiです!
前回の記事では、 SendGrid API と自社アプリを連携させるメリットに関して紹介させていただきました!
今回の記事では、連携の具体例な実装方法に関して紹介させていただきます!

前回の記事はこちら!
https://zenn.dev/lovegraph/articles/a287d22866d057

SendGrid を連携させたプロダクトは Ruby on Rails で構築されたウェブアプリケーションになります。

実装方法

  1. sendgrid-ruby を導入
  2. SendGrid API用の ApiClient の作成
  3. メールテンプレートの作成
  4. 送信したい箇所で ApiClient を呼び出す

1. sendgrid-ruby を導入

まずはじめにアプリケーションに sendgrid-ruby という gem をインストールします。
sendgrid-ruby は SendGrid Web API を Ruby アプリケーション内で簡単に利用できるようにしたライブラリーです。

https://github.com/sendgrid/sendgrid-ruby

既にアプリケーション内にインストールされている場合でも、バージョンが古いことで、利用できない機能があるためアップグレードをおすすめします。

私達のアプリケーションでも、sendgrid-ruby 自体はインストールされていたのですが、今回利用するダイナミックテンプレート用のパラメーターを利用できないバージョンでした。
そのため、今回連携機能を実装するタイミングでバージョンを最新版にアップグレードしました。
(v.5.3から追加された機能でしたが、私達のバージョンはv.5.2でした)

https://github.com/sendgrid/sendgrid-ruby/releases/tag/v5.3.0

2. SendGrid API でメール送信をおこなうための ApiClient を定義

sendgrid-ruby のインストールが終了したら SendGrid API でメール送信をおこなう ApiClient を作成していきます。
ApiClient 内にはメール送信用のメソッドを定義します。

SendGrid のメール送信用 API である Send API では、テンプレートで利用する変数や配信停止グループのグループIDもパラメーターとして指定することができます。
その設定もこちらの ApiClient の send メソッド内で指定していきます。

https://sendgrid.kke.co.jp/docs/API_Reference/Web_API_v3/Mail/index.html

また本番環境以外ではメールを送信しないようにするために、 SendGrid の Sandbox 機能を利用します。

class SendgridApiClient
  def initialize
    @sendgrid_api = SendGrid::API.new(api_key: ENV["SENDGRID_API_KEY"])
  end
  
  # メール送信用メソッド。Send API を呼び出し、SendGrid からメールを送信する。
  # @param  [String]  to_address             送信先メールアドレス
  # @param  [Integer] template_id            SendGrid のダイナミックテンプレートID
  # @param  [Hash]    dynamic_template_data  ダイナミックテンプレート内で利用している変数
  def send(to_address:, template_id:, dynamic_template_data: {})
    mail = SendGrid::Mail.new
    mail.from = SendGrid::Email.new(email: "送信元メールアドレス")
    mail.template_id = template_id

    # 配信停止グループの設定をしたい場合は、SendGrid 上で設定したグループIDを指定
    mail.asm = SendGrid::ASM.new(group_id: 1234)

    # 送信先メールアドレスやテンプレート内で指定されている変数を指定
    personalization = SendGrid::Personalization.new
    personalization.add_to(SendGrid::Email.new(email: to_address))
    personalization.add_dynamic_template_data(dynamic_template_data)
    mail.add_personalization(personalization)

    if !Rails.env.production?
      # SendGrid の Sandbox 機能を利用し、本番環境以外はメールを送信しないようにする
      mail_settings = SendGrid::MailSettings.new
      mail_settings.sandbox_mode = SendGrid::SandBoxMode.new(enable: true)
      mail.mail_settings = mail_settings
    end

    @sendgrid_api.client.mail._("send").post(request_body: mail.to_json)
  end
end


3. メールテンプレートの作成

続いてメールテンプレートを作成します!

前回の記事でもお話した通り、 SendGrid API を用いて SendGrid と自社アプリを連携する際にはテンプレート機能に SendGrid Dynamic Template 機能を利用することが可能です。

SendGrid Dynamic Template 機能を用いたテンプレートの作成方法はこちらのドキュメントが分かりやすいのでご覧ください。

https://sendgrid.kke.co.jp/docs/Tutorials/A_Transaction_Mail/using_dynamic_templates.html

エディタは HTML コーディングにより作成する「Code Editor」、GUIでの操作が中心の「Design Editor」のどちらかを選ぶことが可能です。

「Design Editor」を利用することで、 HTML の知識が無い方でもメールテンプレートの作成・変更が可能なのでとても便利です。

また、宛先ごとに異なる文字列(動的な変数)を入れたい場合があるかと思います。
そのようなときはメールテンプレート内に {{ }} で囲んだタグを入れ込むことで実現可能です。

変数をアプリケーション側でメール送信時に渡すことで、テンプレートと連携することができます。(詳しくは次の節で説明します)

4. 送信したい箇所で ApiClient を呼び出す

メールテンプレートが作成できたら、実際にメールを送信する処理を実装していきます。

アプリケーション上のメールを送信したいタイミングで SendgridApiClient を呼び出します。

SendgridApiClient の send メソッドを呼び出す際は、引数として宛先のメールアドレス(to_address)、 SendGrid 側で作成したダイナミックテンプレートのID(template_id)、テンプレート内で利用している変数を格納したハッシュ(dynamic_template_data)の3点が基本的に必要になります。

メールを送信するためのコードは以下のようになります。(実際のアプリケーションコードとは異なります)


def send_promotion_mail()
    user = User.find(12345)
    # ダイナミックテンプレート作成時に発行されるテンプレートID
    template_id = "d-hogehogehogehoge1234"
    
    # ダイナミックテンプレート内で指定した変数
    dynamic_template_data = {
      "full_name" => user.full_name,
      "promotion_page_url" => promotion_page_url,
    }

    sendgrid_api = SendgridApiClient.new
    sendgrid_api.send(to_address: user.email, template_id: template_id, template_data: dynamic_template_data)
  end

終わりに

「SendGrid API と自社アプリケーションを連携させて SendGrid からメール送信する方法」の連載企画はいかがでしたでしょうか?

メール送信を全てアプリケーションでおこなうか、SendGrid のようなメール送信用 SaaS とアプリケーションを連携させるかは判断が難しいところかもしれませんが、この記事が SendGrid と自社アプリケーションを連携させたいと考えている方の参考になれば幸いです。

最後まで読んでいただきありがとうございました!

ラブグラフのエンジニアブログ

Discussion