Tech Racho エンジニアの「?」を「!」に。
  • 開発

Rails: SendGrid(Web API)とAction Mailerでメールを送信する

こんにちは、yamadaです。入社から1年半ほど経ちますが、初めての記事になります。
今回はRailsとSendGridでメール送信を行った時の手順をまとめようと思います。

  • Rails 5.2
  • SendGrid(V3 Mail Send API)


sendgrid.comより

APIキーの作成

まずはSendGridのAPIキーを作成します。作成方法は公式ドキュメントをご確認ください。

権限は使用目的に合わせて設定しましょう。単純なメール送信だけであれば「Mail Send」を「Full Access」にすればOKです。


APIキーを管理する - ドキュメント | SendGridより

実装

配信方法の切り替えを簡単にするため、delivery_methodを追加する形で対応しました。

参考: Action Mailerのdelivery_methodに独自の配信方法を追加する

SendGridのAPIについては公式ドキュメント(jp, en)をご確認ください。

API呼び出しは公式のgemを利用しています。

実際に作成したのは以下のようなコードになります。
プロジェクトの中に追加する形で対応しましたが、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を利用した時の話も機会があればまとめようと思います。

関連記事

SendGridで独自ドメインからdocomo宛に送信するときの注意点


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。