メインコンテンツまでスキップ

メールアドレスの確認

はじめに

多くのWebアプリケーションでは、ユーザーがアプリケーションを使用する前にメールアドレスを確認する必要があります。各作成するアプリケーションでこの機能を手動で再実装することなく、Laravelはメール確認リクエストの送信と確認のための便利な組込みサービスを提供しています。

注記

すぐに始めたいですか?新しいLaravelアプリケーションにLaravelアプリケーションスターターキットの1つをインストールしてください。スターターキットは、メール確認サポートを含む認証システム全体のスキャフォールディングを自動的に処理します。

モデルの準備

始める前に、App\Models\UserモデルがIlluminate\Contracts\Auth\MustVerifyEmail契約を実装していることを確認してください:

    <?php

namespace App\Models;

use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;

class User extends Authenticatable implements MustVerifyEmail
{
use Notifiable;

// ...
}

このインターフェースがモデルに追加されると、新しく登録されたユーザーには自動的にメールアドレス確認リンクが含まれたメールが送信されます。これは、LaravelがIlluminate\Auth\Events\RegisteredイベントのためにIlluminate\Auth\Listeners\SendEmailVerificationNotification リスナーを自動的に登録するためです。

もしa starter kitを使用せずにアプリケーション内で登録を手動で実装している場合は、ユーザーの登録が成功した後にIlluminate\Auth\Events\Registeredイベントをディスパッチしていることを確認してください:

    use Illuminate\Auth\Events\Registered;

event(new Registered($user));

データベースの準備

次に、users テーブルには、ユーザーのメールアドレスが確認された日時を保存する email_verified_at カラムが含まれている必要があります。通常、これは Laravel のデフォルトの 0001_01_01_000000_create_users_table.php データベースマイグレーションに含まれています。

ルーティング

メールの確認を適切に実装するには、3 つのルートを定義する必要があります。まず、ユーザーに、登録後に Laravel から送られた確認メール内のメール確認リンクをクリックするように促す通知を表示するためのルートが必要です。

次に、ユーザーがメール内のメール確認リンクをクリックしたときに生成されるリクエストを処理するためのルートが必要です。

三番目に、ユーザーが最初の確認リンクを誤って失った場合に、確認リンクを再送信するためのルートが必要です。

メール確認通知

前述のように、ユーザーに、登録後に Laravel からメールで送られたメール確認リンクをクリックするように指示するビューを返すルートを定義する必要があります。このビューは、ユーザーがメールアドレスを確認せずにアプリケーションの他の部分にアクセスしようとしたときに表示されます。App\Models\User モデルが MustVerifyEmail インターフェースを実装している限り、リンクは自動的にユーザーにメールで送信されます:

    Route::get('/email/verify', function () {
return view('auth.verify-email');
})->middleware('auth')->name('verification.notice');

メール確認通知を返すルートは verification.notice という名前にする必要があります。このルートがこの名前で割り当てられていることが重要です。なぜなら、ユーザーがメールアドレスを確認していない場合、Laravel に含まれる verified ミドルウェアが自動的にこのルート名にリダイレクトするからです。

注記

メール確認を手動で実装する場合、確認通知ビューの内容を自分で定義する必要があります。すべての必要な認証と確認ビューが含まれるスキャフォールディングを希望する場合は、Laravel アプリケーションスターターキットをチェックしてください。

メール確認ハンドラ

次に、ユーザーが送信されたメールアドレス確認リンクをクリックしたときに生成されるリクエストを処理するルートを定義する必要があります。このルートは verification.verify という名前を付け、auth および signed ミドルウェアが割り当てられる必要があります:

    use Illuminate\Foundation\Auth\EmailVerificationRequest;

Route::get('/email/verify/{id}/{hash}', function (EmailVerificationRequest $request) {
$request->fulfill();

return redirect('/home');
})->middleware(['auth', 'signed'])->name('verification.verify');

次に進む前に、このルートを詳しく見てみましょう。まず、通常の Illuminate\Http\Request インスタンスの代わりに EmailVerificationRequest リクエストタイプを使用していることに気づくでしょう。EmailVerificationRequest は Laravel に含まれる フォームリクエスト です。このリクエストは、リクエストの id および hash パラメータの検証を自動的に処理します。

次に、リクエスト上で fulfill メソッドを呼び出すことができます。このメソッドは、認証されたユーザー上で markEmailAsVerified メソッドを呼び出し、Illuminate\Auth\Events\Verified イベントをディスパッチします。markEmailAsVerified メソッドは、デフォルトの App\Models\User モデルが Illuminate\Foundation\Auth\User ベースクラスを介して利用できます。ユーザーのメールアドレスが確認されると、任意の場所にリダイレクトできます。

メールアドレス確認メールの再送信

ユーザーがメールアドレス確認メールを紛失したり誤って削除したりした場合があります。これに対応するために、ユーザーが確認メールの再送信をリクエストできるようにするためのルートを定義することができます。次に、確認通知ビュー内に簡単なフォーム送信ボタンを配置することで、このルートにリクエストを行うことができます:

    use Illuminate\Http\Request;

Route::post('/email/verification-notification', function (Request $request) {
$request->user()->sendEmailVerificationNotification();

return back()->with('message', 'Verification link sent!');
})->middleware(['auth', 'throttle:6,1'])->name('verification.send');

ルートの保護

ルートミドルウェア を使用して、確認済みのユーザーのみが特定のルートにアクセスできるようにすることができます。Laravel には verified ミドルウェアエイリアス が含まれており、これは Illuminate\Auth\Middleware\EnsureEmailIsVerified ミドルウェアクラスのエイリアスです。このエイリアスは Laravel によって自動的に登録されているため、ルート定義に verified ミドルウェアをアタッチするだけで済みます。通常、このミドルウェアは auth ミドルウェアとペアになります:

    Route::get('/profile', function () {
// Only verified users may access this route...
})->middleware(['auth', 'verified']);

このミドルウェアが割り当てられたルートに未検証のユーザーがアクセスしようとすると、自動的にverification.noticeという名前付きルートにリダイレクトされます。

カスタマイズ

メール検証のカスタマイズ

ほとんどのアプリケーションの要件を満たすはずのデフォルトのメール検証通知ですが、Laravelではメール検証メッセージの構築方法をカスタマイズすることができます。

始めるには、Illuminate\Auth\Notifications\VerifyEmail通知が提供するtoMailUsingメソッドにクロージャを渡します。クロージャは、通知を受け取る通知可能なモデルインスタンスと、ユーザーがメールアドレスを検証するために訪れる必要がある署名付きメール検証URLを受け取ります。クロージャはIlluminate\Notifications\Messages\MailMessageのインスタンスを返す必要があります。通常、toMailUsingメソッドを、アプリケーションのAppServiceProviderクラスのbootメソッドから呼び出すべきです:

    use Illuminate\Auth\Notifications\VerifyEmail;
use Illuminate\Notifications\Messages\MailMessage;

/**
* Bootstrap any application services.
*/
public function boot(): void
{
// ...

VerifyEmail::toMailUsing(function (object $notifiable, string $url) {
return (new MailMessage)
->subject('Verify Email Address')
->line('Click the button below to verify your email address.')
->action('Verify Email Address', $url);
});
}

注記

メール通知について詳しくは、メール通知のドキュメントを参照してください。

イベント

Laravelアプリケーションスターターキットを使用する場合、Laravelはメール検証プロセス中にIlluminate\Auth\Events\Verified イベントをディスパッチします。アプリケーションでメール検証を手動で処理している場合は、検証が完了した後にこれらのイベントを手動でディスパッチすることができます。