Configurar la autenticación de emails en Laravel 11 con Mailgun y Digital Ocean
Cuando se publicó por primera vez, la versión 5.7 de Laravel añadió una nueva capacidad para verificar los emails de los usuarios. Si alguna vez has ejecutado php artisan make:auth en una aplicación de Laravel, conocerás la sensación de placer y emoción al ver todas tus páginas de registro e inicio de sesión listas, completas con el hash de contraseñas y una tabla de usuarios ya creada.
Esta emoción desaparecerá pronto tras el despliegue en producción, solo para descubrir que cualquiera puede registrarse con garbage@notrealemail.com o cualquier otra cosa que le apetezca escribir. Esta fina capa de autenticación de sesión no sirve de mucho en una aplicación en vivo. La introducción de MustVerifyEmailinterface en Laravel 5.7 se añadió a la estructura de autenticación para que, a fin de iniciar sesión, los usuarios deban utilizar una dirección de email real y válida.
No ha habido cambios significativos en la función de autenticación de emails de Laravel (ahora en la versión 11), pero recomendamos actualizar a la última versión si aún no lo has hecho.
Laravel 11, lanzado el 12 de marzo de 2024, sigue ofreciendo potentes capacidades de verificación de emails y, al mismo tiempo, introduce una estructura de aplicación optimizada y otras mejoras. Este tutorial te guiará en la configuración de la autenticación de emails en Laravel 11 usando Mailgun y en su despliegue en Digital Ocean.
1. El requisito mínimo de PHP es ahora 8.2.
2. Hay una estructura de aplicación más optimizada con un archivo bootstrap/app.php revitalizado.
3. Uso predeterminado de SQLite para el almacenamiento de bases de datos, sesiones, caché y colas.
4. Nueva función de enrutamiento de estado para la monitorización de aplicaciones.
Crear una nueva aplicación de Laravel
El primer paso es crear una nueva aplicación con cierta configuración:
$ laravel new email-verification-example rnrn$ cd email-verification-example rnrn$ touch database/database.sqlite
Esto creará la aplicación predeterminada de Laravel 11.x con la estructura de autenticación y un archivo para una base de datos SQLite. Actualiza tu archivo .env para que apunte a la ruta completa del archivo SQLite:
DB_CONNECTION=sqlite rnDB_DATABASE=/full/path/to/email-verification-example/database/database.sqlite
Verificación de emails en Laravel 11
Revisemos la estructura de autenticación predeterminada y veamos qué cambios deben realizarse para añadir la verificación de emails.
Puedes consultar la documentación de validación de emails de Laravel aquí.
En Laravel 11, el proceso de añadir la verificación de emails sigue siendo similar, pero la estructura de archivos ha cambiado. Abre tu archivo bootstrap/app.php y asegúrate de que incluya lo siguiente:
A continuación, implementa la interfaz MustVerifyEmail. Una interfaz en PHP especifica los métodos que una clase debe implementar. Tendrás que verificar que tu AppModeIsUser implementa el contrato IlluminateContractsAuthMustVerifyEmail:
Esa interfaz obliga a que tengamos tres nuevos métodos en nuestro modelo de usuario:
hasVerifiedEmail()markEmailAsVerified()sendEmailVerificationNotification()
La implementación de estos métodos se puede encontrar en: vendor/laravel/framework/src/Illuminate/Auth/MustVerifyEmail.php. Para marcar a un usuario como verificado, necesitamos tener una columna email_verified_at en nuestra tabla de usuarios, la cual ya se proporciona en nuestra migración predeterminada de creación de tablas de usuarios:
Schema::create('users', function (Blueprint $table) { rn $table->increments('id'); rn $table->string('name'); rn $table->string('email')->unique(); rn $table->timestamp('email_verified_at')->nullable(); rn $table->string('password'); rn $table->rememberToken(); rn $table->timestamps(); rn});
Ejecuta las migraciones para crear la tabla: php artisan migrate.
En el archivo routes/web.php, actualiza las rutas de autenticación para incluir la verificación de emails:
Auth::routes(['verify' => true]);
En Laravel 11, las rutas se definen en el archivo bootstrap/app.php. Asegúrate de que tus rutas web estén incluidas y añade las rutas de verificación:
->withRouting( rnrn web: __DIR__.'/../routes/web.php', rnrn commands: __DIR__.'/../routes/console.php', rnrn health: '/up', rnrn)
A continuación, en tu archivo routes/web.php, añade:
Para ver todas las rutas disponibles de tu aplicación, puedes ejecutar php artisan route:list. Eso es prácticamente todo lo que necesitamos hacer desde el lado de Laravel para verificar emails. Sin embargo, si lo pruebas ahora, no funcionará.

Antes de poder enviar emails desde nuestro servidor PHP, debemos configurar un controlador de email en Laravel. Puedes comprobarlo usando tinker para ver que se creó un usuario con un email_verified_at establecido como nulo.
Pasemos a Mailgun
Mailgun ofrece la capacidad de enviar emails a través del servidor SMTP o mediante su API. En este tutorial, enviaremos emails a través de la API de Mailgun. Es más rápido, escala mejor y requiere menos trabajo de configuración que el SMTP.

Vamos a enviar llamadas a la API. Para ello necesitamos Guzzle:
$ composer require guzzlehttp/guzzle
Para que nuestra aplicación pueda enviar emails, necesitamos un nombre de dominio alojado. Tengo un nombre de dominio que compré a través de Google Domains por unos 12 $ al año. El sitio (https://employbl.com/) está alojado en Laravel Forge por una cuota mensual. Para desplegarlo, seguí el curso de Laracasts Learn Laravel Forge.
En ese curso, configuré mi aplicación de Laravel para que funcionara en droplets de Digital Ocean. En ese proceso, configuré mi nombre de dominio de Google para que apuntara a Digital Ocean.
Una vez que hayas creado una cuenta de Mailgun, tendrás que verificar tu dominio, lo que tarda unas 24 horas. Para ello, debemos añadir registros TXT, CNAME y MX. Si los registros MX ya apuntan a un proveedor de servicios de email, puedes configurar un subdominio en su lugar. Para encontrar estos registros, ve al dominio de tu cuenta de Mailgun y comprueba Verificación de dominio & DNS. Una vez que tengas un dominio de Mailgun en funcionamiento, ve al panel de control para buscar tu clave de API y actualiza el archivo .env según corresponda.
MAIL_DRIVER=mailgun MAILGUN_DOMAIN=mg.YOUR_DOMAIN.com MAILGUN_SECRET=YOUR_KEY_HERE
Comprobar que funciona
Una vez configurado el envío de emails, después de que los usuarios se registren, verán una página de destino donde se les pedirá que revisen su email. Esta página se puede modificar en resources/views/auth/verify.blade.php.

Esto enviará un email real a la dirección proporcionada. La plantilla para este email se encuentra en IlluminateAuthNotificationsVerifyEmail.php.

Si no queremos que nuestros emails de verificación digan “Regards” (Saludos) ni muestren el texto anterior, entonces tendremos que personalizarlos. Puedes publicar las plantillas predeterminadas con los siguientes comandos de publicación:
$ php artisan vendor:publish --tag=laravel-notificationsrn$ php artisan vendor:publish --tag=laravel-mail
A continuación, escribe los nuevos valores predeterminados en resources/views/vendor/notifications/email.blade.php. Si tienes más cosas que cambiar, podrías volver a implementar la notificación añadiendo un nuevo método sendEmailVerificationNotification a tu modelo de usuario que devuelva una notificación personalizada creada por ti.
Una vez que los usuarios hagan clic en el enlace para verificar la dirección de email, se les redirigirá a su panel de control y podrán iniciar sesión sin problemas.

¡Con esto ya deberías poder empezar! La parte más difícil para mí fue configurar el servidor de email y Mailgun. Tras verificar tu dominio y tener Mailgun totalmente configurado, la parte de Laravel acaba siendo de lo más sencilla.
¿Has podido ponerlo todo en marcha? ¿Alguien está utilizando ya esta funcionalidad en producción? Escríbeme en Twitter o deja un comentario a continuación.
Recursos
Estos tutoriales, además de los enlaces anteriores, me han parecido muy útiles.
- Enviar un email desde tu aplicación Node.js utilizando los servicios de la API de Mailgun Gobinda Thakur
- Probar el flujo de autenticación de Laravel Dariusz Czajkowski
¿Quieres más artículos como este de Mailgun?
Connor Leech, nuestro autor invitado, es ingeniero de software en Stitch Labs. Puedes ponerte en contacto con él a través de su email. Para leer más artículos y guías de resolución de problemas, suscríbete a nuestra newsletter para no perderte las ideas de nuestros invitados expertos ni de nuestro equipo de especialistas en email.