目次
- はじめに
- 1. Breeze標準のパスワードリセット機能を確認する
- 2. Mailpitを導入する
- 3. Breezeのパスワードリセットメールが送信される流れ
- 4. パスワードリセットメールを送信する
- 5. 動作確認
- 6. よくあるトラブル
- 7. まとめ
- 8. 関連記事
はじめに
この記事では、Laravel Breezeに標準で用意されているパスワードリセット機能を、Laravel SailとMailpitを使ってローカル環境で動作確認する方法を整理します。
対象は、Laravel Breezeを導入済みのLaravel 10プロジェクトです。
Laravel Breezeには、パスワードリセットに必要なルート、Controller、画面、通知処理などが標準で含まれています。
そのため、この記事で新しくパスワードリセット機能を実装するわけではありません。
既に導入されているBreeze標準機能を確認し、Mailpitでメールを受信できる環境を追加して、一連の動作を確認します。
この記事で確認すること
- Laravel Breezeのパスワードリセット機能が導入済みか確認する
- Laravel SailへMailpitを追加する
- LaravelからMailpitへメールを送信できる状態にする
- Breezeのパスワードリセットメールが送信される流れを理解する
- Mailpitでパスワードリセットメールを受信する
- 新しいパスワードへ変更できることを確認する
- 古いパスワードでログインできないことを確認する
前提環境
- Laravel 10
- Laravel Breeze
- Laravel Sail
- MySQL
- Blade
この記事では、独自メール送信に使用する
Mailableクラスは扱いません。
Breezeのパスワードリセットメールは、Laravel標準のNotificationを利用して送信されます。
1. Breeze標準のパスワードリセット機能を確認する
Mailpitを追加する前に、Breeze標準のパスワードリセット機能が現在のプロジェクトに存在することを確認します。
Breezeを通常どおり導入していれば、基本的には既に用意されています。
1-1. パスワードリセット関連のルートを確認する
次のコマンドで、登録済みルートを確認します。
./vendor/bin/sail artisan route:list --path=password
--path=passwordでは、パスワード確認・変更・リセットに関するルートがまとめて表示されます。
このうち、パスワードリセットで使用するのはpassword.request、password.email、password.reset、password.storeの4件です。
パスワードリセットでは、主に次の名前付きルートが使用されます。
password.request
password.email
password.reset
password.store
それぞれの役割は次のとおりです。
| ルート名 | 役割 |
|---|---|
password.request |
パスワードリセット依頼画面を表示する |
password.email |
リセットリンクをメール送信する |
password.reset |
メール内のリンクから再設定画面を表示する |
password.store |
新しいパスワードを保存する |
1-2. Controllerを確認する
Breezeでは、パスワードリセット処理を主に次のControllerが担当します。
app/Http/Controllers/Auth/PasswordResetLinkController.php
app/Http/Controllers/Auth/NewPasswordController.php
役割は次のとおりです。
| Controller | 役割 |
|---|---|
PasswordResetLinkController |
リセット依頼画面の表示と、リセットリンクの送信 |
NewPasswordController |
新しいパスワード入力画面の表示と、パスワード更新 |
1-3. Bladeファイルを確認する
Breezeでは、通常、次の画面が用意されています。
resources/views/auth/forgot-password.blade.php
resources/views/auth/reset-password.blade.php
| Bladeファイル | 役割 |
|---|---|
forgot-password.blade.php |
メールアドレスを入力してリセットリンクを依頼する画面 |
reset-password.blade.php |
新しいパスワードを入力する画面 |
1-4. パスワードリセット用テーブルを確認する
Laravel 10では、パスワードリセットトークンの保存に、通常次のテーブルを使用します。
password_reset_tokens
password_reset_tokensテーブルには、パスワードリセットを依頼したメールアドレス、リセット用トークン、作成日時が保存されます。
主なカラムは次の3つです。
| カラム名 | 用途 |
|---|---|
email |
パスワードリセットを依頼したメールアドレス |
token |
パスワードリセット用トークン |
created_at |
トークンの作成日時 |
Laravel Breezeを導入済みで、対応するマイグレーションが反映されていれば、このテーブルはすでに作成されています。
今回は、phpMyAdminでpassword_reset_tokensテーブルが存在することと、以下の3つのカラムが作成されていることを確認しました。
ここまでのルート、Controller、Blade、テーブルが揃っていれば、パスワードリセット機能本体を新しく作る必要はありません。
2. Mailpitを導入する
2-1. Mailpitサービスを追加する
Laravel Sailを起動した状態で、プロジェクトディレクトリから以下を実行します。
cd ~/projects/review-app-laravel
./vendor/bin/sail artisan sail:add
サービスの選択画面が表示されたら、mailpitを選択します。
追加後、compose.yamlにMailpitサービスが含まれていることを確認します。
grep -n "mailpit" compose.yaml
2-2. Mailpit用の環境変数を確認する
公開記事では、実際の.envの内容や秘密情報を掲載しません。
設定例は.env.exampleを基準に確認します。
MAIL_MAILER=smtp
MAIL_HOST=mailpit
MAIL_PORT=1025
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
ローカル環境では、同じ設定を各自の.envへ反映します。
.envには環境固有の設定や秘密情報が含まれるため、Gitへコミットしません。
記事や公開リポジトリへ設定例を掲載する場合は、実値ではなく.env.exampleを使用します。
2-3. 既存環境とポートが重複する場合
Mailpitは標準で次のホスト側ポートを使用します。
- SMTP受信用:
1025 - 管理画面:
8025
既存環境と重複する場合は、ホスト側へ公開するポートを変更します。
FORWARD_MAILPIT_PORT=1026
FORWARD_MAILPIT_DASHBOARD_PORT=8026
この設定を使用する場合でも、LaravelコンテナからMailpitへ接続する設定は変更しません。
MAIL_HOST=mailpit
MAIL_PORT=1025
ホスト側へ公開するポートと、Dockerネットワーク内でLaravelが接続するポートは別だからです。
2-4. Sailを再起動する
Mailpitを追加したら、Sailを再起動します。
./vendor/bin/sail down
./vendor/bin/sail up -d
起動状態を確認します。
./vendor/bin/sail ps
標準ポートを使用している場合は、Mailpitに次のポート割り当てが表示されます。
0.0.0.0:1025->1025/tcp
0.0.0.0:8025->8025/tcp
ポートを変更した場合は、次のように表示されます。
0.0.0.0:1026->1025/tcp
0.0.0.0:8026->8025/tcp
2-5. Mailpit管理画面を開く
標準ポートの場合は、次のURLを開きます。
http://localhost:8025
管理画面のポートを8026へ変更した場合は、次のURLを開きます。
http://localhost:8026
Mailpitの管理画面が表示されれば、Mailpitサービスの起動確認は完了です。
Mailpitはローカル開発用のメール受信ツールです。
本番環境のメール送信には使用しません。
3. Breezeのパスワードリセットメールが送信される流れ
Laravel Breezeには、パスワードリセットに必要な画面、ルート、Controllerなどが用意されています。
パスワードリセットメールの送信処理は、大まかに次の流れです。
「パスワードを忘れた方」を開く
↓
メールアドレスを入力する
↓
Password Brokerへリセットリンクの送信を依頼する
↓
UserモデルへResetPassword通知が送られる
↓
Laravelのメール設定を使用してメールを送信する
↓
Mailpitで受信する
↓
メール内のリンクから新しいパスワードを設定する
Mailableクラスは必要ない
独自のお問い合わせメールなどを実装する場合は、Mailableクラスを作成して件名や本文を定義することがあります。
一方、Breeze標準のパスワードリセットでは、Laravelが用意しているResetPassword Notificationが使用されます。
そのため、パスワードリセットメールを送信するだけなら、次の作業は不要です。
-
sail artisan make:mailの実行 -
Mailableクラスの作成 -
envelope()の設定 -
content()の設定 - 独自メール本文用Bladeの作成
-
Mail::to(...)->send(...)の実装
必要なのは、Laravelからメールを送信できる設定と、Breeze標準機能の存在確認、そして一連の動作確認です。
4. パスワードリセットメールを送信する
4-1. パスワードリセット画面を開く
Laravel Breezeのログイン画面から、「パスワードを忘れた方」のリンクを開きます。
4-2. 登録済みメールアドレスを入力する
会員登録済みユーザーのメールアドレスを入力し、パスワードリセットリンクの送信を実行します。
動作確認には登録済みメールアドレスを使用します。
4-3. Mailpitでメールを確認する
Mailpit管理画面を開き、パスワードリセットメールが受信されていることを確認します。
標準ポートの場合:
http://localhost:8025
ポートを変更した場合:
http://localhost:8026
受信したメールには、パスワードリセット画面へ移動するためのリンクが表示されます。
4-4. 新しいパスワードを設定する
メール内のリンクを開き、次の情報を入力します。
- メールアドレス
- 新しいパスワード
- 新しいパスワードの確認入力
送信後、パスワードが更新されます。
5. 動作確認
パスワードリセット後は、次の正常動作を確認します。
5-1. 新しいパスワードでログインできる
変更後の新しいパスワードを使ってログインできることを確認します。
5-2. 古いパスワードではログインできない
変更前のパスワードではログインできないことを確認します。
この2点を確認することで、メールが届いただけでなく、実際にパスワードが更新されたことまで確認できます。
6. よくあるトラブル
Mailpitへメールが届かない
次を確認します。
- Mailpitコンテナが起動しているか
-
MAIL_MAILERがsmtpになっているか -
MAIL_HOSTがmailpitになっているか -
MAIL_PORTが1025になっているか - Breezeのパスワードリセット関連ルートが存在するか
- 登録済みメールアドレスを使用しているか
- パスワードリセット依頼が実行されているか
起動状態は次のコマンドで確認できます。
./vendor/bin/sail ps
ルートは次のコマンドで確認できます。
./vendor/bin/sail artisan route:list
ログイン画面に「パスワードを忘れた方」が表示されない
次を確認します。
- Breezeの認証ルートが読み込まれているか
-
password.requestルートが登録されているか - ログイン画面のBladeからパスワードリセット画面へのリンクが削除されていないか
- Breeze導入後に認証画面を独自変更していないか
パスワードリセット画面を開けない
次を確認します。
-
PasswordResetLinkControllerが存在するか -
NewPasswordControllerが存在するか -
forgot-password.blade.phpが存在するか -
reset-password.blade.phpが存在するか -
password_reset_tokensテーブルが存在するか
Mailpit管理画面を開けない
ホスト側の管理画面ポートを確認します。
標準設定:
http://localhost:8025
ポート変更時:
http://localhost:8026
Dockerコンテナ内のポート8025と、ホスト側に公開するポートは同じとは限りません。
ポートが競合する
すでに別のサービスが1025または8025を使用している場合は、ホスト側ポートを変更します。
FORWARD_MAILPIT_PORT=1026
FORWARD_MAILPIT_DASHBOARD_PORT=8026
ただし、Laravel側の接続先は次のままです。
MAIL_HOST=mailpit
MAIL_PORT=1025
設定変更が反映されない
設定を変更した後は、Sailを再起動して確認します。
./vendor/bin/sail down
./vendor/bin/sail up -d
設定キャッシュを利用している環境では、古い設定が残っていないかも確認します。
7. まとめ
Laravel Breezeを導入済みであれば、パスワードリセットに必要なルート、Controller、Blade、通知処理などは基本的に用意されています。
そのため、独自のMailableクラスやパスワードリセット処理を新しく作成する必要はありません。
今回確認した内容は次のとおりです。
- Breeze標準のパスワードリセット関連ルートを確認する
- ControllerとBladeが存在することを確認する
-
password_reset_tokensテーブルを確認する - Laravel SailへMailpitを追加する
- LaravelのSMTP接続先をMailpitへ設定する
- Breeze標準のパスワードリセット処理を実行する
- Mailpitでメールを受信する
- 新しいパスワードへ変更できることを確認する
- 古いパスワードが使用できないことを確認する
独自メール送信で使用するMailableは、問い合わせフォームなどを実装するときに別の記事として整理できます。
