RailsでのSendGrid X-SMTPAPIの使い方

公開日: 2016年12月6日GitHub

Ruby on Railsを用いたプロジェクトで、SendGridを使用する方法についてまとめてみました。

SendGridの提供API

種類

SendGridは下記の4種類のAPIを提供しています。

  • X-SMTPAPI
  • WebAPI v2
  • WebAPI v3
  • WebHook API

できること

上記のAPIを利用することで、下記の様な動作を実現できます。

  • 1通の送信で1000件~10000件の大量送信
  • 予約配信
  • メールのカテゴリ別で開封率・クリック率を取得できる

導入検討

導入する上での懸念点

現在Ruby on Railsで自社サービスを開発しているのですが、公式のRuby gemの導入を見送りました。 RailsのActionMailerの機構と統合するのが難しいと感じたためです。

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

1require 'sendgrid-ruby'
2include SendGrid
3
4from = Email.new(email: 'test@example.com')
5subject = 'Hello World from the SendGrid Ruby Library!'
6to = Email.new(email: 'test@example.com')
7content = Content.new(type: 'text/plain', value: 'Hello, Email!')
8mail = Mail.new(from, subject, to, content)
9
10sg = SendGrid::API.new(api_key: ENV['SENDGRID_API_KEY'])
11response = sg.client.mail._('send').post(request_body: mail.to_json)
12puts response.status_code
13puts response.body
14puts response.headers
15

結局どうしたか

ActionMailerの機構を維持しつながら自前でコードを書くことにしました。 SendGridのAPIの中でも、X-SMTPAPIはSMTPプロトコルでAPIを利用できます。 ActionMailerを利用する上ではこれが最適だと考え、X-SMTPAPIを利用することにしました。

導入方法

基礎編

SendGridのX-SMTPAPIは、メールのヘッダー部分にJSON形式でパラメーターを与えることで利用することができます。 JSONを作成し、ActionMailer内で利用できるheadersに格納してください。

メールのカテゴリを指定する例

1class UserNotifier < ActionMailer::Base
2 default :from => 'any_from_address@example.com'
3
4 def send_signup_email(user)
5 # カテゴリをつける場合の例
6 xsmtp_api_params = { category: ['category1', 'category2'] }
7 headers['X-SMTPAPI'] = JSON.generate(xsmtp_api_params)
8 @user = user
9 mail( :to => @user.email,
10 :subject => 'Thanks for signing up for our amazing app' )
11 end
12end
13

参考: https://sendgrid.kke.co.jp/docs/API_Reference/SMTP_API/using_the_smtp_api.html

備考

RFC 821ではテキスト行の最大長さは1000文字です。この文字列をご自身で生成する場合、上記の制限に収まるよう確認することをお勧めします。

https://sendgrid.kke.co.jp/docs/API_Reference/SMTP_API/using_the_smtp_api.html

とあります。ActionMailerを利用している場合は、自動的に長さを調節してくれるので問題ないようです。 https://stackoverflow.com/questions/15992281/newlines-resolved-as-0a-in-sendgrid-x-smtpapi-header

実践編

大量送信をする

1xsmtp_api_params = { to: ['メールアドレス1', 'メールアドレス2', ...] }
2headers['X-SMTPAPI'] = JSON.generate(xsmtp_api_params)
3

最大は10000件まで同時送信可能ですが、SendGrid側の処理速度が遅くなってしまうので1000件までにしましょう。

https://sendgrid.kke.co.jp/blog/?p=1300

予約送信をする

send_atを指定することでメールが届く時間を指定することが出来ます。

1time = Time.zone.now + 1.hour
2xsmtp_api_params = { send_at: time.to_i }
3headers['X-SMTPAPI'] = JSON.generate(xsmtp_api_params)
4

ただし、送信時刻は実際に送信された時刻のままであり届く時間のみが変わるようです。 なのでメーラーによっては、送信時刻でソートしているため、過去のメールの中に埋もれてしまうこともあります。

カテゴリをつけてメールを区別する

1xsmtp_api_params = { category: ['category1', 'category2'] }
2headers['X-SMTPAPI'] = JSON.generate(xsmtp_api_params)
3

メール種別ごとにカテゴリをつけることで、各メールの種類ごとに開封率・クリック率を計測できます。

ただし、カテゴリは累計100個までが推奨らしいので注意。

現状、トラック可能なカテゴリの数には制限はありません。しかし、ユニークカテゴリ数は100を超えないことを推奨 します。これによりダッシュボード内のStatistics機能の利用性が向上するためです。また、ユニークカテゴリ数が多い場合、メール送信速度に悪い影響を与えます。

https://sendgrid.kke.co.jp/docs/API_Reference/SMTP_API/categories.html

まとめ

上記の方針で、Railsでも簡単にSendGridのAPIを利用することができます。

SendGridには他にもユーザーごとに配信コンテンツを変更する機能があります。応用が効くのでぜひ試してみてください。

ユーザーごとに配信コンテンツを変更する https://sendgrid.kke.co.jp/docs/API_Reference/SMTP_API/substitution_tags.html

This site uses Google Analytics.
source code