はじめに
webアプリケーションを作っている際に、本番環境でパスワードリセットメールを送信しようとするとタイムアウトが起きてしまう事態が発生しました。
調査したところ、ホスティング環境ではSMTP接続が制限されている場合があるため、SMTPではなく メール送信API を利用する方法に切り替えることにしました。
その際に、Resendという外部APIを使ったところ問題なくメール送信ができるようになったので、その方法をご共有いたします。
ResendのAPIキー取得
Resendはメール送信をAPI経由で簡単に行うことができるメール配信サービスです。
まずはこちらのWebサイトにアクセスいただき、アカウントを作成します。
ログイン成功後に、左側のサイドバーからAPI Keysを選択します。
遷移後のページでCreate API keyボタンを押します。
設定を進めると、APIキーが表示されるとのでそちらを控えておきましょう。
APIキーは生成時のみ表示されます。
セキュリティの関係上、後から確認できないため必ず控えておきましょう。
ドメイン認証
メールを送信するためにドメイン認証が必要になります。
左側のサイドバーからDomainsを選択します。
アプリのドメインをAdd domainボタンを押して追加しましょう。
Recordsタブから、ドメイン認証に必要な値を確認することができます。これらをドメイン側に設定する必要があります。
これらの値をドメイン側に(お名前.com)などのDNSレコードに追加しておきます。
これは 送信ドメイン認証(SPF / DKIM) のための設定で、
メールのなりすましを防ぎ、正しい送信元からのメールであることを証明するための設定です。
ResendのDomainsページで認証を開始し、以下のようになれば成功です。
アプリ側の設定
まずはresendをインストールします。
gem "resend"
bundle install
環境変数の設定をします。
# config/initializers/resend.rb
Resend.api_key = ENV["RESEND_API_KEY"]
Deviseのメール送信処理を記述します。
# app/mailers/devise_mailer.rb
class DeviseMailer < Devise::Mailer
def reset_password_instructions(record, token, opts = {})
reset_url = edit_user_password_url(reset_password_token: token)
Resend::Emails.send({
from: "送信元メールアドレス",
to: record.email,
subject: "パスワードリセット",
html: "<p>こちらからパスワードをリセットしてください</p>
<a href='#{reset_url}'>パスワードをリセット</a>"
})
end
end
作ったカスタムのメイラーを指定します。
# config/initializers/devise.rb
config.mailer = "DeviseMailer"
まとめ
今回は、Resendを利用してDeviseのパスワードリセットメールをAPI経由で送信する方法を紹介しました。
実装の流れは以下の通りです。
-
ResendでAPIキーを取得
-
ドメイン認証(DNS設定)を行う
-
gem resend をインストール
-
DeviseのMailerをカスタマイズ
-
Resend APIを利用してメール送信
SMTPが利用できない環境でも、APIを利用することで安定してメール送信を行うことができました。
同様の問題に直面した方の参考になれば幸いです。




