Render環境下(本番環境)で、Rails(Devise)とBrevoを使用してメール送信機能を実装した際に発生したエラーと、その解決策のまとめです。
最終的なコードは、下部にまとめております。
環境
- フレームワーク: Ruby on Rails 8(Devise導入済み←これによるエラーあり)
- プラットフォーム: Render
- メール配信サービス: Brevo
発生したエラーと対応
1. 接続タイムアウト
エラーログ:
Net::OpenTimeout (execution expired)
原因:
Render 等のクラウド環境では、スパム対策としてポート587の通信が制限される場合があるそうで、500エラーが出て全く肝心のメールが届くかまで辿り着かず…。
対応:
config/environments/production.rb の SMTP ポート設定を 587 から Brevo 推奨の代替ポート 2525 に変更する。
参考URL: Which SMTP port should I use? (Port 587, 465, or 2525)
2. SMTP認証エラー
1を修正すると、今度は認証エラーのログが出ました。
エラーログ:
Net::SMTPAuthenticationError (535 5.7.8 Authentication failed)
原因:
smtp_settings の user_name に、Brevoに登録したメールアドレスを設定していたため。
対応:
Brevo 管理画面
SMTP & API → SMTP にある 「Login」 の値を設定する。
末尾が下記のようになっているはず。
******brevo.com
※登録したメールアドレスではないので注意!!
3. 送信元メールアドレス (Sender) の未認証
対応:
- アプリ専用のGmailアドレスを取得
- Brevo 管理画面
Senders & IP → Senders で登録・認証 -
mailers/application_mailer.rbのdefault fromを認証したメールアドレスに変更
4. Devise 設定の未反映
エラーログ:
Sender (From) please-change-me-at-config-initializers-devise@example.com is not valid
原因:
Devise の送信元設定は、ApplicationMailerより優先されるため、デフォルト値のまま送信されていた。
対応:
config/initializers/devise.rb の
config.mailer_sender
を認証済みメールアドレス(送信元メールアドレス)へ変更する。
最終的なコード
1. config/environments/production.rb
SMTP 接続設定
# 作成したアプリのURLを入れるが、ドメイン(https://)は入れない。
config.action_mailer.default_url_options = { host: '******.onrender.com', protocol: 'https' }
config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = {
# Brevo 管理画面の「Login」の値
user_name: '******brevo.com',
# SMTP Key(GitHub環境変数で設定した値(key))
password: ENV['******'],
# 作成したアプリのURL。ドメイン(https://)は入れない。
domain: '******.onrender.com',
address: 'smtp-relay.brevo.com',
port: 2525,
authentication: :plain, # authentication: メールサーバーで認証が必要な場合はここで認証の種類を指定
enable_starttls_auto: true # enable_starttls_auto: SMTPサーバーでSTARTTLSが有効かどうかを検出して有効にする。デフォルトはtrue。
}
※STARTTLS: 暗号化されていない平文での通信を、SSL/TLSを利用した暗号化通信に切り替える仕組み
2. app/mailers/application_mailer.rb
通常のメーラー設定
class ApplicationMailer < ActionMailer::Base
default from: "認証済みメールアドレス(送信元メールアドレス)を書く"
layout "mailer"
end
3. config/initializers/devise.rb
Devise 専用の送信元設定
Devise.setup do |config|
# ApplicationMailerより優先されるため必ず変更
config.mailer_sender = '認証済みメールアドレス(送信元メールアドレス)を書く'
end
まとめ
Render + Brevo + Devise のメール送信トラブル
- タイムアウトエラー → 587ポート → 2525ポートを使用
- SMTP Login を正しく設定
- 認証済み Sender を使用
- Devise の mailer_sender を必ず変更
上記を修正し、ようやく本番環境でパスワードリセットメールを送ることができました!
タイムアウトエラー続いたところは、Renderのログからは詳細が読み取れないので、一番ダメージ受けました。