Saltar al contenido principal

Introducción

La verificación de correo electrónico (Email Verification) es un mecanismo para comprobar que el usuario realmente posee la dirección de correo que ha registrado. Laravel proporciona de serie el envío del correo de confirmación y la lógica de verificación, por lo que puedes construir un flujo de autenticación seguro con muy poca implementación.
Si utilizas un starter kit, las pantallas de autenticación y el flujo de verificación de correo ya están integrados. Si lo implementas manualmente, sigue los pasos de esta página para definir por tu cuenta el modelo, las rutas y las vistas.

Preparación del modelo y de la base de datos

Implementar MustVerifyEmail

Comprueba que App\Models\User implemente la interfaz 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;
}
Al añadir esta interfaz, se envía automáticamente un correo de confirmación a los nuevos usuarios registrados. Si estás implementando el registro sin usar un starter kit, tras el registro exitoso debes emitir el evento Registered.
use Illuminate\Auth\Events\Registered;

event(new Registered($user));

Comprobar la columna email_verified_at

La tabla users debe contar con una columna email_verified_at. Habitualmente ya está incluida en la migración por defecto 0001_01_01_000000_create_users_table.php.

Enrutamiento (tres rutas)

Para la verificación de correo se definen tres rutas: verification.notice, verification.verify y verification.send.
1

Definir la ruta de aviso de verificación (verification.notice)

Devuelve la pantalla que muestra a los usuarios no verificados el mensaje “Por favor, verifica tu correo”.
Route::get('/email/verify', function () {
    return view('auth.verify-email');
})->middleware('auth')->name('verification.notice');
2

Definir la ruta de verificación (verification.verify)

Cuando el usuario pulsa el enlace del correo, se valida la URL firmada y se completa la verificación.
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');
3

Definir la ruta de reenvío (verification.send)

Reenvía el correo de verificación si el usuario lo pierde.
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');

Protección de rutas

Para permitir el acceso solo a usuarios ya verificados, usa el middleware verified. Habitualmente se combina con auth.
Route::get('/profile', function () {
    // Solo accesible por usuarios verificados
})->middleware(['auth', 'verified']);
Si un usuario no verificado accede, Laravel lo redirige automáticamente a verification.notice.

Personalización

Para personalizar el cuerpo del correo de verificación, configura VerifyEmail::toMailUsing en el método boot de AppServiceProvider.
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);
    });
}

Eventos

Cuando se completa la verificación de correo se dispara el evento Illuminate\Auth\Events\Verified. Los starter kits lo gestionan automáticamente; en una implementación manual, añade el manejo del evento según lo necesites.
Última modificación el 13 de julio de 2026