Email

Configurar la autenticación de emails en Laravel 11 con Mailgun y Digital Ocean

Integra la versión 11.x de Laravel con Mailgun para añadir la capacidad de verificar los emails de los usuarios. Sigue leyendo para descubrir nuestra guía paso a paso.
Imagen para 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á.

Laravel code

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.

Mailgun API call

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

Más información: Laravel ha pasado a un modelo de versiones anuales. Ahora en la V10, puedes esperar correcciones el 6 de agosto de 2024 y parches de seguridad para el 14 de febrero de 2025. Ver las notas de la versión de Laravel 10.

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.

Verify your email Laravel

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

Laravel verify email address link

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.

Laravel login

¡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.

¿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.