Идёт обновление сайта. Несколько дней возможны сбои в оформлении и переводах. Документация работает — если страница выглядит сломанной, обновите её позже.

Документация
L Laravel L intervention/image
Войти
Главная Laravel 10.x Проверка электронной почты

Проверка электронной почты

10.x 7 мар 2026 г.

#Введение

Многие веб-приложения требуют, чтобы пользователи подтверждали свои адреса электронной почты перед использованием приложения. Вместо того чтобы заставлять вас реализовывать эту функцию вручную для каждого приложения, Laravel предоставляет удобные встроенные сервисы для отправки и проверки запросов на подтверждение электронной почты.

Примечание

Хотите быстро начать? Установите один из стартовых наборов Laravel в свежем приложении Laravel. Стартовые наборы автоматически создадут всю систему аутентификации, включая поддержку проверки электронной почты.

#Подготовка модели

Перед началом убедитесь, что ваша модель 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;

    // ...
}

После добавления этого интерфейса в модель, новым зарегистрированным пользователям автоматически будет отправлено письмо с ссылкой для подтверждения электронной почты. Как видно из App\Providers\EventServiceProvider вашего приложения, Laravel уже содержит слушатель SendEmailVerificationNotification listener, привязанный к событию Illuminate\Auth\Events\Registered. Этот слушатель отправит пользователю ссылку для подтверждения.

Если вы реализуете регистрацию вручную, а не используете стартовый набор, убедитесь, что после успешной регистрации пользователя вы вызываете событие Illuminate\Auth\Events\Registered:

use Illuminate\Auth\Events\Registered;

event(new Registered($user));

#Подготовка базы данных

Далее в таблице users должен быть столбец email_verified_at для хранения даты и времени подтверждения адреса электронной почты пользователя. По умолчанию миграция таблицы users, входящая в Laravel, уже содержит этот столбец. Поэтому достаточно просто выполнить миграции базы данных:

php artisan migrate

#Маршрутизация

Для корректной реализации проверки электронной почты необходимо определить три маршрута. Во-первых, маршрут, который будет показывать пользователю уведомление о необходимости нажать на ссылку подтверждения, отправленную Laravel после регистрации.

Во-вторых, маршрут для обработки запросов, возникающих при нажатии пользователем на ссылку подтверждения в письме.

В-третьих, маршрут для повторной отправки ссылки подтверждения, если пользователь случайно потерял первое письмо.

#Уведомление о проверке электронной почты

Как уже упоминалось, необходимо определить маршрут, который будет возвращать представление с инструкцией для пользователя нажать на ссылку подтверждения, отправленную Laravel после регистрации. Это представление будет показываться пользователям, которые пытаются получить доступ к другим частям приложения без подтверждения электронной почты. Помните, что ссылка автоматически отправляется пользователю, если ваша модель App\Models\User реализует интерфейс MustVerifyEmail:

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

Маршрут, возвращающий уведомление о проверке электронной почты, должен иметь имя verification.notice. Важно, чтобы маршрут имел именно это имя, так как middleware verified, входящий в Laravel, автоматически перенаправит на этот маршрут, если пользователь не подтвердил свой адрес электронной почты.

Примечание

При ручной реализации проверки электронной почты вам нужно самостоятельно определить содержимое представления уведомления. Если вы хотите получить готовую структуру со всеми необходимыми представлениями для аутентификации и проверки, ознакомьтесь со стартовыми наборами Laravel.

#Обработчик проверки электронной почты

Далее нужно определить маршрут, который будет обрабатывать запросы при нажатии пользователем на ссылку подтверждения в письме. Этот маршрут должен иметь имя verification.verify и использовать middleware 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');

Прежде чем продолжить, рассмотрим этот маршрут подробнее. Во-первых, здесь используется тип запроса EmailVerificationRequest вместо обычного Illuminate\Http\Request. EmailVerificationRequest — это form request, включённый в 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', 'Ссылка для подтверждения отправлена!');
})->middleware(['auth', 'throttle:6,1'])->name('verification.send');

#Защита маршрутов

Middleware маршрутов можно использовать, чтобы разрешить доступ к маршруту только подтверждённым пользователям. Laravel поставляется с алиасом middleware verified, который ссылается на класс Illuminate\Auth\Middleware\EnsureEmailIsVerified. Поскольку этот middleware уже зарегистрирован в HTTP kernel вашего приложения, достаточно просто добавить его к определению маршрута. Обычно его используют вместе с middleware auth:

Route::get('/profile', function () {
    // Доступ к этому маршруту разрешён только подтверждённым пользователям...
})->middleware(['auth', 'verified']);

Если неподтверждённый пользователь попытается получить доступ к маршруту с этим middleware, его автоматически перенаправят на именованный маршрут verification.notice.

#Настройка

#Настройка письма с подтверждением

Хотя стандартное уведомление о проверке электронной почты подходит для большинства приложений, Laravel позволяет настроить, как формируется письмо с подтверждением.

Для начала передайте замыкание в метод toMailUsing, предоставляемый уведомлением Illuminate\Auth\Notifications\VerifyEmail. В замыкание будет передан экземпляр модели, получающей уведомление, и подписанный URL для подтверждения электронной почты, по которому пользователь должен перейти. Замыкание должно вернуть экземпляр Illuminate\Notifications\Messages\MailMessage. Обычно вызов toMailUsing делают в методе boot класса App\Providers\AuthServiceProvider вашего приложения:

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('Подтвердите адрес электронной почты')
            ->line('Нажмите кнопку ниже, чтобы подтвердить ваш адрес электронной почты.')
            ->action('Подтвердить адрес электронной почты', $url);
    });
}
Примечание

Чтобы узнать больше о почтовых уведомлениях, ознакомьтесь с документацией по почтовым уведомлениям.

#События

При использовании стартовых наборов Laravel Laravel генерирует события в процессе проверки электронной почты. Если вы реализуете проверку вручную, возможно, вам захочется самостоятельно генерировать эти события после завершения проверки. Вы можете привязать слушателей к этим событиям в EventServiceProvider вашего приложения:

use App\Listeners\LogVerifiedUser;
use Illuminate\Auth\Events\Verified;

/**
 * Сопоставления слушателей событий для приложения.
 *
 * @var array
 */
protected $listen = [
    Verified::class => [
        LogVerifiedUser::class,
    ],
];