heroku + Rails で devise などのメール送信機能を使いたいなら Mailgun という選択肢があることを知っておこう
heroku + Ruby on Rails で devise のメール送信機能を使いたい
- letter_opener_web | RubyGems.org | コミュニティのGemホスティングサービス
ローカルで開発してる時は letter_opener_web や development.log からメール送信内容を確認できますが、サービスとして公開するときはそうもいきません。
実際にメールを送信したいわけですからね。SMTPサーバが必要になります。
手段としては SMTPレンタルサーバー, AmazonSES, SendGrid などいろいろありますが、
今回は heroku Add-on にもある Mailgun を使ってみました。
かなり簡単に使用することができたので、Mailgun の紹介をしたいと思います。
SMTPレンタルサーバー, AmazonSES, SendGrid を使う方法については今回の範囲外なので
以下記事など参考にやってみてください。
- HerokuからエックスサーバーのSMTPサーバーを使ってメール送信する方法 | かんたんラクラク IT効率化術
- 【AWS】Amazon SES / Messaging・Route53を用いてドメインメールを送信する | Qiita
- Heroku にデプロイした Rails アプリから SENDGRID を使ってメール送信する | Qiita
Mailgun とは
Mailgun とは SendGrid, AmazonSES のようなメール配信PaaSのひとつで、
SMTPサーバの詳しい知識がなくともメール送信機能を利用することができます。
- Transactional Email API Service For Developers | Mailgun
- いますぐ使う Mailgun | Qiita
heroku Add-on で Maligun を導入する
- Mailgun | Add-ons | Heroku Elements
Mailgun のサイトからもアカウントを作成することができますが、
今回は heroku から使えればいいので heroku Add-on として導入します。
heroku でアプリを作成したら、Resourcesタブから検索して…
Submit Order Form で Add-on を追加することができます
- Herokuに関するメモ | よし | zenn
この記事にもあるように、Add-on に Mailgun を追加することで以下の環境変数が
heroku confing に自動で設定されます。
- MAILGUN_API_KEY
- MAILGUN_DOMAIN
- MAILGUN_PUBLIC_KEY
- MAILGUN_SMTP_LOGIN
- MAILGUN_SMTP_PASSWORD
- MAILGUN_SMTP_PORT
- MAILGUN_SMTP_SERVER
このうち以下3つについては default のMailgun検証用アカウント(sandboxアカウント) の情報がセットされていますので、独自ドメインからメールを送信したい場合は後で上書きしてやる必要があります(後述)
- MAILGUN_DOMAIN
- MAILGUN_SMTP_LOGIN
- MAILGUN_SMTP_PASSWORD
config/environments/production.rb で ActionMailer の設定を行う
- 困ったときのヒント集 | Railsチュートリアル
- Mailgun | Heroku Dev Center
上記ドキュメントにも書いてあるように、heroku 環境変数(heroku config) に設定された環境変数を使うように、config/environments/production.rb で ActionMailer の設定を行う必要があります。大体こんな感じです。
Rails.application.configure do
...
config.action_mailer.raise_delivery_errors = true
ActionMailer::Base.delivery_method = :smtp
ActionMailer::Base.smtp_settings = {
:port => ENV['MAILGUN_SMTP_PORT'],
:address => ENV['MAILGUN_SMTP_SERVER'],
:user_name => ENV['MAILGUN_SMTP_LOGIN'],
:password => ENV['MAILGUN_SMTP_PASSWORD'],
:domain => 'yourapp.heroku.com',
:authentication => :plain,
}
...
end
環境変数の設定が終わったら、heroku に push しましょう。
$ git push heroku main
Ruby on Rails からメールを送ってみる
クレジットカード情報が登録されている状態なら、
ここまでで既にメールが送れる状態になっていると思います。
まずはメールを送る行為(devise でのユーザー作成時の認証メール送信など)をやってみてください。
メールが届かないときは……
送れない場合やクレジットカード情報を登録していないときは、送信先を登録してやる必要があります。送信先をsandboxアカウントに登録する方法は以下のような感じです。
- heroku のアプリ管理画面 > Resources > に表示されている Mailgun をクリック
- Maligun のダッシュボードが開きます
- Sending > Domains から Sandbox ドメインをクリック
- 右側にある Authorized Recipients から送信先のメールアドレスを登録
- 確認メールが届くので I agree
- メール送信先として登録できるので、メールを送信してみる
できたでしょうか。
defaultで用意されている sandbox SMTPアカウントを使ってメールを送った場合の受信時の見た目
こんな感じで、 sandbox.mgsend.net 経由
と表示されます。
広く全く知らない人に使ってもらうとかだと何これ?となりますが、
知人に軽く公開したサービスを使ってもらうなどメールアドレスを知っている人に送る分には
毎回前述の送信先設定をしてもそんなに面倒ではないですし、これが表示されてても何これ?とはならないと思うので特に問題ないですね。Mailgun を free プランで使うならここまでの設定で十分利用できると思います。
Mailgun から独自ドメインのメールを送るようにする
とはいえ、heroku で Webサービスを公開したい!というときは
毎回送信先を登録するのも面倒ですし送信主を自前の独自ドメインにしたい!ということもありますね。
では設定していきましょう
Mailgun を Concept 50k plan 以上にする
- Mailgun | Add-ons | Heroku Elements
もしかするとこの手順は不要なのかもしれないのですが……
free プランだと使用できる SMTP アカウントが 1 つしかなく、
その上で default で用意されている sandbox アカウントを削除する方法がわからなかったので、
独自ドメインの SMTP アカウントを作成するために Concept 50k plan 以上にします。
default の sandbox アカウントを削除する方法を知っている人がいましたらコメントで教えてください。
Mailgun のダッシュボードから Add new domain する
Mailgun のダッシュボード > Sending > Domains から Add new domain ボタンを押します。
するとこんな画面が開くので必要な情報を入力して Add Domain します。
右の方に書いてあるように、Mailgun 用にサブドメインを使った方がいいよと書いてあるので
できる限りそうしましょう。
Mailgun に表示された TXT レコードをドメイン側の DNS レコードに追加する
Add Domain するとこんな画面が表示されるので、
ここに表示されている TXT レコードの Key と Value を ドメイン側の DNS レコードに追加します。
(この画面は既に下記 Verify DNS Settings で OK になった状態なので 緑のチェックマークがついていますが、最初はついていないはずです)
ドメインの DNS レコードに TXT レコードを追加する方法は各種ドメインを買ったプラットフォーム(販売事業者)ごとに異なるので、自分のドメインを買ったところのヘルプなどを探してみてください。
こんなヘルプがどこでも用意されているはずです。
- DNS関連機能の設定:DNSレコード設定|お名前.com Navi ガイド|ドメイン取るならお名前.com
- お名前.com の場合
- https://www.onamae.com/guide/p/70
- ドメインの所有権を TXT レコードで証明する | Google Workspace 管理者 ヘルプ
- Google Domains の場合
- https://support.google.com/a/answer/183895?hl=ja#zippy=
- メールの送信を開始する方法 | MailgunAPIドキュメント
- ここにもいくつか設定方法へのリンクがあります
- https://documentation.mailgun.com/en/latest/quickstart-sending.html#common-dns-providers
ドメイン側で TXT レコードの設定が終わったら、
Mailgun のダッシュボード側で Verify DNS Settings をしてみてください。
Mailgun の TXT レコード設定が緑のチェックマークになったら設定はOKです。
Mailgun に Add Domain した設定を heroku 環境変数に反映する
前述したように、heroku 環境変数(heroku config)に最初から設定される値の中で以下3つについては default のMailgun検証用アカウント(sandboxアカウント) の情報がセットされていますので、独自ドメインからメールを送信したい場合は後で上書きしてやる必要があります。
- MAILGUN_DOMAIN
- 先ほど Add Domain したものになります(Mailgun ダッシュボードにも表示されているはず)
- MAILGUN_SMTP_LOGIN
- Mailgun のダッシュボード > Sending > Domain settings で左上の Domain: が先ほど設定したドメインになっている状態で、SMTP credentials タブにアカウント名が表示されています
- MAILGUN_SMTP_PASSWORD
- 上記アカウント名右横の Reset Password をクリックすることで小さく Click Copy Password と表示されるので、そこをクリックすることでクリップボードに発行されたパスワードがコピーされます
あとは、これらの値を heroku 環境変数にセットしてやるだけです。
# heroku のリモートリポジトリを設定したローカルリポジトリのディレクトリ配下で実行
$ heroku config:set MAILGUN_DOMAIN=XXXXXXXXX
$ heroku config:set MAILGUN_SMTP_LOGIN=XXXXXXXXX
$ heroku config:set MAILGUN_SMTP_PASSWORD=XXXXXXXXX
# 設定が終わったら再デプロイして環境変数を吸い上げ直しましょう
$ git push heroku main
これで設定は完了です! 再度メールを送ってみてください。
sandbox.mgsend.net 経由
の表示が消えているはずですし、
今後は送信したいメールを都度 Verify する必要もないはずです。
メールの再送信も Mailgun ダッシュボードから可能
Mailgun のプランにもよりますが、
free プランなら 1日, Concept 50k plan なら 3日はログが確認できます。
ログの表示からは送ったメールの詳細や再送信などが可能なので、
もし「メールが届かない!」といった問い合わせがあった場合は確認してみるといいでしょう。
参考
このあたりの記事も参考になりました。
- Laravelのメール送信機能でHerokuのMailgun使った時ハマりまくったのでうまくいった設定とか書く | Qiita
- メール配信サービスMailgunでメール送信するための手順をまとめてみた | arms inc. Engineers' Blog
- ruby on rails | Verified email not sending through Heroku/Mailgun | Stack Overflow
今回はここまでです。じゃ!
Discussion