本文へ移動
Laravel Tips

メールアドレスの確認

新しく登録した人のメールアドレスが本物かを確かめる「メールアドレスの確認」を、モデルの準備・ルート・再送・ルートの保護・メールの変更まで説明します。

多くのアプリは、使い始める前に、ユーザーのメールアドレスを確かめます。登録のときに入れたアドレスに確認のメールを送り、その中のリンクを押してもらう方法です。Laravel には、この確認メールを送って確かめる機能が最初から入っているので、アプリごとに作り直さなくて済みます。

補足

早く始めたいなら、新しい Laravel アプリにスターターキット(最初から画面や機能がそろった雛形)を入れます。メールアドレスの確認を含む、認証の一式が用意されます。

準備#

モデルの準備#

まず、App\Models\User が、Illuminate\Contracts\Auth\MustVerifyEmail(「メールアドレスの確認が必要」を表す、決まった形の約束事)を実装している(約束どおりのメソッドを持っている)ことを確かめます。

php
<?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 というリスナー(知らせを受けて動く処理)を、自動で登録しているからです。

スターターキットを使わず、登録を自分で作っているなら、登録が成功したあとに、Illuminate\Auth\Events\Registered イベントを出すようにしてください。

php
use Illuminate\Auth\Events\Registered;

event(new Registered($user));

データベースの準備#

users の表に、メールアドレスを確かめた日時を入れる email_verified_at の列が必要です。Laravel の標準の 0001_01_01_000000_create_users_table.php というマイグレーション(表を作る手順書)に、ふつう入っています。

ルート#

メールアドレスの確認には、ルート(URL と処理を結びつけたもの)を3つ作る必要があります。

  1. 登録のあとに、「メールのリンクを押してください」と知らせる画面を出すルート
  2. ユーザーがメールのリンクを押したときの、リクエストを処理するルート
  3. ユーザーが最初のメールを失くしたときに、確認のリンクをもう一度送るルート

確認をお願いする画面#

1つ目のルートは、「登録のあとに Laravel が送ったメールの確認リンクを押してください」と伝えるビュー(画面の見た目を書いたファイル)を返します。メールアドレスを確かめていないユーザーが、アプリのほかの場所を開こうとしたときにも、この画面が出ます。App\Models\User が MustVerifyEmail を実装していれば、リンクは自動でメールで送られます。

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

このルートの名前は、必ず verification.notice にします。Laravel に最初から入っている verified ミドルウェア(あとで説明します)が、メールアドレスを確かめていないユーザーを、この名前のルートへ自動で転送するからです。

補足

メールアドレスの確認を自分で作るときは、確認をお願いする画面の中身を、自分で書く必要があります。必要な認証の画面が全部そろった雛形がほしいなら、スターターキットを見てください。

確認のリンクを処理する#

2つ目は、ユーザーがメールの確認リンクを押したときの、リクエストを処理するルートです。名前は verification.verify にし、auth と signed のミドルウェア(リクエストが処理に届く前に、間に入って確かめる処理)を付けます。

php
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 を使っています。これは Laravel に入っているフォームリクエスト(入力の確認を、専用のクラスにまとめたもの)で、リクエストの id と hash のパラメータを、自動で確かめます。

次に、リクエストの fulfill を呼びます。これは、ログイン中のユーザーの markEmailAsVerified を呼び、Illuminate\Auth\Events\Verified イベントを出します。markEmailAsVerified は、標準の App\Models\User が継承している(もとにしている)Illuminate\Foundation\Auth\User に入っています。メールアドレスを確かめたあとは、好きな場所へ転送できます。

確認メールを送り直す#

ユーザーが確認のメールを、なくしたり、うっかり消したりすることがあります。そのために、確認メールをもう一度送ってもらうルートを作れます。確認をお願いする画面に、ボタンのついた簡単なフォームを置けば、このルートへリクエストを送れます。

php
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 には、Illuminate\Auth\Middleware\EnsureEmailIsVerified の別名(短い呼び名)として、verified が最初から用意されています。ルートに付けるだけです。ふつう、auth ミドルウェアといっしょに付けます。

php
Route::get('/profile', function () {
    // メールアドレスを確かめたユーザーだけが使える
})->middleware(['auth', 'verified']);

メールアドレスを確かめていないユーザーが、このミドルウェアの付いたルートを開こうとすると、verification.notice という名前のルートへ、自動で転送されます。

変更する#

確認メールを変える#

標準の確認メールは、ほとんどのアプリに足りますが、メールの作り方を変えることもできます。

Illuminate\Auth\Notifications\VerifyEmail(通知のクラス)の toMailUsing に、クロージャ(名前のない関数)を渡します。クロージャは、通知を受け取るモデルと、ユーザーが開く、署名つき(書きかえられていないことを確かめる印が付いた)の確認の URL を受け取ります。そして、Illuminate\Notifications\Messages\MailMessage を返します。ふつう、アプリの AppServiceProvider の boot の中で呼びます。

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

/**
 * アプリのサービスを起動する
 */
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 が Illuminate\Auth\Events\Verified というイベントを出します。メールアドレスの確認を自分で作っているなら、確認が終わったあとに、このイベントを手動で出すとよいでしょう。

関連するページ#

公式ドキュメント(英語)

2026年10月5日時点の内容をもとに、日本語でまとめています。

ページの一覧