LaravelのメールをResendで送る設定方法【DNS認証まで解説】

LaravelのメールをResendで送る設定方法【DNS認証まで解説】

はじめに:Laravelのデフォルトメール設定の罠

Laravelでメール送信を実装したのに、なぜかメールが届かない……そんな経験はないだろうか。

実はLaravelのデフォルト設定では MAIL_MAILER=log になっており、メールは実際には送信されずにログファイルに書き出されるだけだ。開発中は便利な設定だが、本番環境や実際に送信テストをしたいときは別のドライバに切り替える必要がある。

この記事では、無料から使えるメール送信サービス「Resend」を使ってLaravelからメールを送る設定方法を、DNS認証の手順も含めて丁寧に解説する。


Resendとは

Resend(resend.com)は開発者向けのメール送信サービスだ。SMTPにも対応しており、LaravelからはほぼSMTP設定を変えるだけで使える。

無料枠:月3,000通 / 1日100通まで(2024年時点)

個人開発やスタートアップの初期フェーズなら十分な通数だ。ダッシュボードが見やすく、送信ログや失敗ログも確認しやすいのが特徴。


Resendアカウント作成・ドメイン追加

1. アカウント作成

resend.com/signup からGitHubアカウント等で登録する。

2. ドメインを追加する

ダッシュボードの「Domains」→「Add Domain」から、送信元に使うドメイン(例:yourdomain.com)を入力する。

追加するとDNSレコードの設定画面が表示される。ここに表示される値を、次のステップでDNSに登録していく。

3. APIキーを発行する

「API Keys」→「Create API Key」でキーを発行しておく。後で .env に設定する。


DNSレコードの設定(お名前.comを例に)

Resendのドメイン認証には、SPF・DKIM・DMARCの3種類のDNSレコードを追加する必要がある。お名前.comでの手順を例に解説する。

お名前.comでのDNS設定手順

  1. お名前.comのコントロールパネルにログイン
  2. 「ドメイン」→「DNS設定」→対象ドメインを選択
  3. 「DNSレコード設定を利用する」を開く

Resendのダッシュボードに表示されるレコードを以下のように追加する。

TXTレコード(SPF / DKIM)

# SPF
タイプ: TXT
ホスト名: @ または yourdomain.com
値: v=spf1 include:amazonses.com ~all

# DKIM
タイプ: TXT
ホスト名: resend._domainkey
値: (Resendダッシュボードに表示される長い文字列)

MXレコード

タイプ: MX
ホスト名: send
値: feedback-smtp.us-east-1.amazonses.com
優先度: 10

DMARCレコード

タイプ: TXT
ホスト名: _dmarc
値: v=DMARC1; p=none;

設定後、Resendダッシュボードの「Verify DNS Records」をクリックして認証を確認する。DNSの反映には最大24〜48時間かかる場合があるが、多くの場合は数分〜数十分で反映される。

注意:DNS認証が完了していない状態でメールを送ると 550 The domain is not verified エラーが返ってくる。認証完了を必ず確認してから次のステップへ進もう。


.env設定

Laravel プロジェクトの .env に以下を設定する。

MAIL_MAILER=smtp
MAIL_HOST=smtp.resend.com
MAIL_PORT=465
MAIL_USERNAME=resend
MAIL_PASSWORD=re_xxxxxxxxxxxxxxxxxxxx  # ResendのAPIキー
MAIL_ENCRYPTION=ssl
MAIL_FROM_ADDRESS=hello@yourdomain.com
MAIL_FROM_NAME="${APP_NAME}"

ポイントをまとめると:

  • MAIL_MAILERlog から smtp に変更する(これが最重要)
  • MAIL_USERNAME は文字列の resend 固定
  • MAIL_PASSWORD にResendで発行したAPIキーをセット
  • ポートは 465(SSL)または 587(TLS)が使える

注意:.envに同じキーが2行ある場合、最初の行が優先される。既存の MAIL_MAILER=log が残ったままだと、後から書いた smtp の設定が無視される。重複がないか必ず確認しよう。


config:clearで設定を反映する

.env を変更したあとは、必ずキャッシュをクリアする必要がある。Laravelはパフォーマンスのために設定をキャッシュしており、クリアしないと変更が反映されない。

php artisan config:clear

本番環境などでキャッシュを使っている場合は合わせて以下も実行しておく。

php artisan cache:clear
php artisan config:cache

動作確認

Tinkerを使ってメール送信をテストするのが手軽だ。

php artisan tinker
>>> Mail::raw('テスト送信', function($msg) {
...     $msg->to('test@example.com')->subject('テスト');
... });

エラーが出なければ送信成功だ。Resendのダッシュボード「Emails」タブでも送信ログを確認できる。

MailableクラスやNotificationを使っている場合も同様に動作するはずだ。


ハマりポイントまとめ

実際に設定する中でハマりやすいポイントをまとめておく。

1. MAIL_MAILER=log のままで送信できない

Laravelのデフォルト設定。メールはログファイル(storage/logs/laravel.log)に書かれるだけで、実際には送信されない。smtp に変更すること。

2. .envにキーの重複がある

MAIL_MAILER が2行ある場合、先に書いた方が優先される。追記してもそのままになっている log 設定が残っていると上書きされないので注意。

3. 550 The domain is not verified

ResendのDNS認証が完了していないと送信できない。ダッシュボードでドメインのステータスが「Verified」になっているか確認する。

4. config:clearを忘れる

.env を変更してもキャッシュが残っていると変更が反映されない。必ず php artisan config:clear を実行する。

5. レート制限エラー「Please wait before retrying」

短時間に何度も送信テストを繰り返すとレート制限に引っかかることがある。このときは以下を試す。

php artisan cache:clear

それでも解決しない場合は少し時間を置いてから再試行する。


まとめ

LaravelのメールをResendで送るための設定手順をまとめると:

  1. Resendでアカウント作成・ドメイン追加・APIキー発行
  2. お名前.com(または利用中のDNSサービス)でTXT/MX/DMARCレコードを追加
  3. Resendダッシュボードでドメインの「Verified」を確認
  4. .envMAIL_MAILERsmtp に変更し、Resendの接続情報を設定
  5. php artisan config:clear でキャッシュをクリア
  6. Tinkerで動作確認

Resendは無料枠でも十分使えるし、ダッシュボードが開発者フレンドリーで使いやすい。SESの複雑なセットアップに比べてずっとシンプルに導入できるので、個人開発やLaravelプロジェクトのメール送信には最初の選択肢として検討してみてほしい。