SakuraWi - BLog

WEBエンジニア。聴いたお話をまとめておく倉庫的な。スタックストックスタック!

【Ruby on Rails】SendGridのAPIを使ってメールを送信する


Ruby on Railsでメールを飛ばすのを利用するときに SendGridを検討することは多いと思います。

結構本番環境で飛ばしたり、API使ってやるにあたってハマったところが多かったので残します。

smtpの設定で飛ばす方法の記事は多いのですが、APIを利用する記事が少なかったのもあり。

Ruby on RailsでSendGrid APIを使う概要

SendGridを利用してメールを飛ばす際に、SMTPを利用して設定してMailerからメールを送る方法が一般的(よく検索ヒットする)ですが、
SendGridには便利なAPIが提供されています。

Ruby on Railsを利用しつつ、SendGrid APIを利用するメリットとしては、以下がありますかね。

  • API Keyのみの設定で良い。 usernameやpasswordの設定が不要
  • イベントの設定ができる(API経由の方がイベントなどを設定できたりするぽい?です。)

まずはSendGridのAPIドキュメントを見よう

公式のドキュメントはこちら。
Rubyもちゃんとあります。

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

ほぼメールのclassを利用する箇所をみれば、まぁなるほどとはなると思います。

事前設定をしてからrequestするってイメージですね。

README(github)
https://github.com/sendgrid/sendgrid-ruby

https://github.com/sendgrid/sendgrid-ruby#with-mail-helper-class

が、これをRailsのActionMailerと一緒に使おうと思うとちょっとうまく噛み合わせる必要がありそうです。

いい感じにSendGridのAPIをRuby on Railsで利用する

で、便利な記事がこちら。

https://techracho.bpsinc.jp/yamada/2018_12_22/67222

ほぼ上記のコードをコピペしたら動きます。

が、少し修正点が必要だったりしたので。

fromのドメインをきちんと設定する

fromで送られるメールの送信元は、sendgridの方できちんと設定しておく必要があります。 ドメインの問題ですね。

sendgridのサイトで登録しましょう。

mail.body.raw_source

この部分ですが、Railsのメールの設定によっては、空白で返されてしまいます。

APIからのレスポンスを見ると、content部分は空白では飛ばせないようです。

f:id:Saku-Saku:20200428202101p:plain

そのため、raw_sourceをうまくとれるようにしてあげます。

    content = SendGrid::Content.new(type: 'text/plain', value: mail.body.parts[0].body.raw_source)

plainのtext.haml(.erb)と htmlのメールのテンプレートがあった場合、選択できるようになっているため、 .parts[0] が必要になるようです。

Rails6のwarningがでる

lib/配下においたりすることで、RspecでエラーがでたりRails6でのエラーが生じてました。

以下の記事で対応しました。

lib配下において、requireすると警告は消えてうまく動作してくれます。

一応、 models配下や mailers配下でも動くのは動くみたいです。 ただ、initializeのメソッドが呼ばれていたりすると警告がでるみたい。

https://qiita.com/jnchito/items/b8f40e7fe82b07bc3de8

また、ファイル名によって読み込みがうまくされない、ということもあったので、そこも注意しましょう。

meilの送信に関する独自のメソッドを適用することについて

Action Mailerのdelivery_methodに独自の配信方法を追加する場合、なぜそのように書くのかの理解が深まりました。

https://qiita.com/sheepland/items/0bbf5c6f9fba08caf0a6