heroku + Rails で devise などのメール送信機能を使いたいなら Mailgun という選択肢があることを知っておこう

8 min read

heroku + Ruby on Rails で devise のメール送信機能を使いたい

ローカルで開発してる時は letter_opener_web や development.log からメール送信内容を確認できますが、サービスとして公開するときはそうもいきません。
実際にメールを送信したいわけですからね。SMTPサーバが必要になります。

手段としては SMTPレンタルサーバー, AmazonSES, SendGrid などいろいろありますが、
今回は heroku Add-on にもある Mailgun を使ってみました。
かなり簡単に使用することができたので、Mailgun の紹介をしたいと思います。

SMTPレンタルサーバー, AmazonSES, SendGrid を使う方法については今回の範囲外なので
以下記事など参考にやってみてください。

Mailgun とは

Mailgun とは SendGrid, AmazonSES のようなメール配信PaaSのひとつで、
SMTPサーバの詳しい知識がなくともメール送信機能を利用することができます。

heroku Add-on で Maligun を導入する

Mailgun のサイトからもアカウントを作成することができますが、
今回は heroku から使えればいいので heroku Add-on として導入します。
heroku でアプリを作成したら、Resourcesタブから検索して…

Submit Order Form で Add-on を追加することができます

この記事にもあるように、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 の設定を行う

上記ドキュメントにも書いてあるように、heroku 環境変数(heroku config) に設定された環境変数を使うように、config/environments/production.rb で ActionMailer の設定を行う必要があります。大体こんな感じです。

config/environments/production.rb
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アカウントに登録する方法は以下のような感じです。

  1. heroku のアプリ管理画面 > Resources > に表示されている Mailgun をクリック
  2. Maligun のダッシュボードが開きます

  1. Sending > Domains から Sandbox ドメインをクリック
  2. 右側にある Authorized Recipients から送信先のメールアドレスを登録

  1. 確認メールが届くので I agree
  2. メール送信先として登録できるので、メールを送信してみる

できたでしょうか。

defaultで用意されている sandbox SMTPアカウントを使ってメールを送った場合の受信時の見た目

こんな感じで、 sandbox.mgsend.net 経由 と表示されます。
広く全く知らない人に使ってもらうとかだと何これ?となりますが、
知人に軽く公開したサービスを使ってもらうなどメールアドレスを知っている人に送る分には
毎回前述の送信先設定をしてもそんなに面倒ではないですし、これが表示されてても何これ?とはならないと思うので特に問題ないですね。Mailgun を free プランで使うならここまでの設定で十分利用できると思います。

Mailgun から独自ドメインのメールを送るようにする

とはいえ、heroku で Webサービスを公開したい!というときは
毎回送信先を登録するのも面倒ですし送信主を自前の独自ドメインにしたい!ということもありますね。
では設定していきましょう

Mailgun を Concept 50k plan 以上にする

もしかするとこの手順は不要なのかもしれないのですが……
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 レコードを追加する方法は各種ドメインを買ったプラットフォーム(販売事業者)ごとに異なるので、自分のドメインを買ったところのヘルプなどを探してみてください。
こんなヘルプがどこでも用意されているはずです。

ドメイン側で 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日はログが確認できます。
ログの表示からは送ったメールの詳細や再送信などが可能なので、
もし「メールが届かない!」といった問い合わせがあった場合は確認してみるといいでしょう。

参考

このあたりの記事も参考になりました。

今回はここまでです。じゃ!