Rails (gem 'sendgrid-ruby') × SendGrid の Event Notification で API Key ごとの独自メタ情報を設定する

Rails (gem 'sendgrid-ruby') × SendGrid の Event Notification で API Key ごとの独自メタ情報を設定する

SendGrid の Event Notification の使い所

SendGrid には Event Notification という Webhook を設定することでメールの送信状態をイベント情報として取得することができます。

メールを SendGrid が受信した、送信先に届いた、等の情報です。

SendGrid - メールが届いているか確認する

例えば、未達だったメールの情報を取得したい場合等に、この Webhook を利用し、イベント情報を保存することで調査や集計が可能です。

AWS API Gateway + Lambda で構築したエンドポイントに投げ、S3 に保存し、送信失敗件数を Athena で検索集計する、ということができます。

何か問題でも?

SendGrid は 1 アカウントで複数のプロジェクト毎の API Key を発行することができます。

ですが、 イベント情報にはどの API Key を利用してメール送信したか、の記録がありません。

複数の API Key がある場合に、どのプロジェクトのどの環境で送信したのか、調査や集計ができません。

これを解決する手段として、メール送信時にメタ情報を登録する方法があります。

Rails 5.2 で試してみました。

まずはセットアップ

  • Gemfile
1
gem 'sendgrid-ruby'
  • config/initializers/sendgrid.rb
1
2
sendgrid_api_key = Rails.application.credentials.dig(Rails.env.to_sym, :sendgrid_api_key)
ActionMailer::Base.add_delivery_method :sendgrid, Mail::SendGrid, api_key: sendgrid_api_key

api_key は credentials に設定し、そこから取得。
※ RAILS_ENV=development でお試し可なので直に設定でも可。そこは自己責任で

  • lib/mail/send_grid.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# frozen_string_literal: true

class Mail::SendGrid
def initialize(settings)
@settings = settings
end

def deliver!(mail)
sg_mail = SendGrid::Mail.new
sg_mail.from = SendGrid::Email.new(email: mail.from.first)
sg_mail.subject = mail.subject
personalization = SendGrid::Personalization.new
personalization.add_to(SendGrid::Email.new(email: mail.to.first))
personalization.subject = mail.subject
sg_mail.add_personalization(personalization)
sg_mail.add_content(SendGrid::Content.new(type: 'text/plain', value: mail.body.raw_source))

// ここでカテゴリー情報として登録
sg_mail.add_category(SendGrid::Category.new(name: "#{Rails.env}-#{Settings.project_name}"))

sg = SendGrid::API.new(api_key: @settings[:api_key])
response = sg.client.mail._('send').post(request_body: sg_mail.to_json)
Rails.logger.info response.status_code
end
end

#{Rails.env}-#{Settings.project_name} の部分は適宜変更してください。

メール送信してみる

rails c して

1
ActionMailer::Base.mail(to: "nakayama.kinnikunn@hogehoge.jp", from: "info@<sender authentication で認証したドメイン>", subject: "メールタイトル", body: "すいません、テスト送信です").deliver_now

すると、Event Notification では以下の様なイベント情報が取得できます。

1
{"email":"nakayama.kinnikunn@hogehoge.jp","timestamp":1551964210,"ip":"12.345.67.89","sg_event_id":"xxxxxxxxxxxxxxxx","sg_message_id":"xxxxxxxxxxxxxxxxxxxx.yyyyyyyyyyyyyyyyyyyyyy","category":["staging-kenkoboys"],"useragent":"Mozilla/5.0 (Windows NT 5.1; rv:11.0) Gecko Firefox/11.0 (via ggpht.com GoogleImageProxy)","event":"open"}

注目すべきは category":["staging-kenkoboys"] です。

add_category したカテゴリ情報が取得でき、これで どの API Key のイベント情報であるかの紐付けができます。

以上
参考になれば幸いです。

Rails (gem 'sendgrid-ruby') × SendGrid の Event Notification で API Key ごとの独自メタ情報を設定する

https://kenzo0107.github.io/2019/03/12/2019-03-13-rails-gem-sendgrid-ruby-x-sendgrid-event-notification-api-key/

Author

Kenzo Tanaka

Posted on

2019-03-13

Licensed under

コメント