追記: Railsチュートリアルのテキストで使用されていた SendGrid アドオンは、Mailgun に変更となりました。よって、以下の対応をする機会はなくなるかと思います🙏これまで SendGrid アドオンでうまくいかなかった方も、Mailgun バージョンで再チャレンジしてみてくださいね👌✨
参考: Railsチュートリアルヘルプ
Railsチュートリアル11章では、本番環境でメール送信する際に、SendGrid を Heroku にアドオンする必要があるのですが、SendGrid アカウントが凍結される方が多くみられたため、解決方法をまとめてみました。
準備: SendGrid アカウントが凍結されているかを確認する
本番環境でメール送信をした後、このような画面が出る。
heroku logs --tail
でログを確認。メールの文面ログの後に、以下のようなログが含まれていると凍結されている。
Net::SMTPAuthenticationError (535 Authentication failed: account disabled
メール文面のログがない場合は、もう一度コードの見直しをした方が良さそうです💦
対処方法
米国のSendGridに英語で問い合わせると使える状態にしてくれる、といった情報が多いようですが、自力ですぐに解決できます。
1. 現在の Heroku アプリを削除する
2. 新しく Heroku アプリを作る
https://dashboard.heroku.com/apps から Create new app します。名前は変更した方が確実かと思います。
3. production 環境の SMTP 設定に URL を追加しgit push
する
Railsチュートリアル11.4 の「Railsのproduction環境でSendGridを使う設定」の host = '<your heroku app>.herokuapp.com'
部分に新しいHerokuのURLを記入し、git push
しておく。
Rails.application.configure do
.
.
.
config.action_mailer.raise_delivery_errors = true
config.action_mailer.delivery_method = :smtp
host = '<your heroku app>.herokuapp.com'
config.action_mailer.default_url_options = { host: host }
ActionMailer::Base.smtp_settings = {
:address => 'smtp.sendgrid.net',
:port => '587',
:authentication => :plain,
:user_name => ENV['SENDGRID_USERNAME'],
:password => ENV['SENDGRID_PASSWORD'],
:domain => 'heroku.com',
:enable_starttls_auto => true
}
.
.
.
end
4. remote 先に新しい Heroku git URL を 設定する
URL は、Heroku の Settings ページで確認できます。
$ heroku git:remote -a https://git.heroku.com/〇〇.git
# 正しく設定されたか確認
$ git remote -v
5. Heroku に push する
$ git push heroku
$ heroku run rails db:migrate
6. 最後に SendGrid アドオンする
$ heroku addons:create sendgrid:starter
# Herokuの環境変数を表示したい場合
$ heroku config:get SENDGRID_USERNAME
$ heroku config:get SENDGRID_PASSWORD
以上で完了です。新しく作った本番環境で、メール送信できるか試してみてください 💌
追記: 一度使えるようになっても、しばらく経つとまた凍結していることがあります。SendGridのセキュリティ上の事情なのかもしれませんが、また同じ手順でAppを作り直すのが早そうです😥
参考: SendGrid - アカウント凍結のフローとその解除方法について教えてください。
アカウントが凍結される可能性が高いケースとして、次のようなものがあります。
- SendGridの認証情報(パスワードやAPIキーなど)がパブリックな場所に置かれていることが発覚した等、セキュリティリスクを理由としたケース
- 存在しない宛先への送信(Bounce)や誤った宛先への送信(Invalid)等、レピュテーションが下がることを理由としたケース
- 急激な送信量の増加を検知した等、アカウントの不正利用が疑われるケース
アカウントの停止は、このような重大な事態を防ぐための措置でもあるということをご理解ください。