こんにちは、yamadaです。入社から1年半ほど経ちますが、初めての記事になります。
今回はRailsとSendGridでメール送信を行った時の手順をまとめようと思います。
- Rails 5.2
- SendGrid(V3 Mail Send API)
APIキーの作成
まずはSendGridのAPIキーを作成します。作成方法は公式ドキュメントをご確認ください。
権限は使用目的に合わせて設定しましょう。単純なメール送信だけであれば「Mail Send」を「Full Access」にすればOKです。
実装
配信方法の切り替えを簡単にするため、delivery_method
を追加する形で対応しました。
参考: Action Mailerのdelivery_methodに独自の配信方法を追加する
SendGridのAPIについては公式ドキュメント(jp, en)をご確認ください。
API呼び出しは公式のgemを利用しています。
- リポジトリ: sendgrid/sendgrid-ruby
実際に作成したのは以下のようなコードになります。
プロジェクトの中に追加する形で対応しましたが、gemとして作成するとより良いかもしれませんね。
# config/initializers/sendgrid.rb
ActionMailer::Base.add_delivery_method :sendgrid, Mail::SendGrid,
api_key: xxxxxxxxxxxxxxxxxxxxxxxxxxx
# config/environments/development.rb
config.action_mailer.delivery_method = :sendgrid
# lib/mail/send_grid.rb
class Mail::SendGrid
def initialize(settings)
@settings = settings
end
def deliver!(mail)
from = SendGrid::Email.new(email: mail.from.first)
to = SendGrid::Email.new(email: mail.to.first)
subject = mail.subject
content = SendGrid::Content.new(type: 'text/plain', value: mail.body.raw_source)
sg_mail = SendGrid::Mail.new(from, subject, to, content)
sg = SendGrid::API.new(api_key: @settings[:api_key])
response = sg.client.mail._('send').post(request_body: sg_mail.to_json)
puts response.status_code
end
end
メール送信
Mailerを用意してメールを送信してみます。
# app/mailers/test_mailer.rb
class TestMailer < ApplicationMailer
def test_mail
mail(from: 'from@example.com', to: 'to@example.com', subject: 'テストメール')
end
end
# app/views/test_mailer/test_mail.text.erb
SendGrid送信テスト
TestMailer.test_mail.deliver_now
最後に
この記事ではWeb APIを使用したメール送信について書きましたが、SMTPを使用することもできます。
両者の違いついてはSendGridとの連携をご確認ください。
Web APIを使用する場合、送信したメールとEvent Webhookの連携が簡単になるのかなと思います。
RailsでEvent Webhookを利用した時の話も機会があればまとめようと思います。