Laravel trae por defecto un sistema de autenticación de usuarios que puedes agregar a tu aplicación con el comando php artisan make:auth
. Este sistema incluye la funcionalidad para la recuperación de contraseña de un usuario, que envía un email con el mensaje y el enlace para que el usuario pueda recuperarla, sin embargo, este correo es genérico y en inglés, por lo que si tu aplicación está en español o quieres un mensaje más descriptivo necesitarás personalizar esta funcionalidad. Con este tutorial aprenderás cómo crear un mensaje para el correo de recuperación de contraseñas adaptado al contexto de tu aplicación:
Cuando un usuario de nuestro sistema hace clic en la opción «¿Olvide mi contraseña?» o «Forgot Your Password?» y escribe en su dirección de correo, a su bandeja de entrada llega de manera predeterminada algo como lo siguiente:
Veamos cómo podemos personalizar este mensaje:
Sobrescribe el envío del email
Lo primero que debes saber es que el email para recuperar la contraseña se envía como una notificación por medio del sistema de notificaciones de Laravel. Esto está configurado a través del trait Illuminate\Auth\Passwords\CanResetPassword
en el modelo User
, el cual contiene dos métodos:
getEmailForPasswordReset
que recupera el email del usuario a donde se enviará la notificación. Necesitarás modificar este método si el atributo de tu modeloUser
donde se encuentra la dirección de correo del usuario no se llamaemail
.sendPasswordResetNotification
con el cual se envía la notificación, usando la clase encargada de construir el email a enviar. Debes cambiar la notificación por la personalizada por ti.
Por tanto, para personalizar el email debemos sobrescribir este trait, pero no lo podemos hacer directamente pues es un archivo que se encuentra en el directorio vendor
. Para ello, tenemos dos opciones: crear en nuestro directorio app un nuevo trait que use el modelo User
o agregar directamente el o los métodos en dicho modelo. ¿Cuál opción escoger? Depende de ti.
Tomando la segunda opción puedes entonces agregar el método sendPasswordResetNotification
a tu modelo User
y usar una notificación creada por ti, en vez de la predeterminada de Laravel:
public function sendPasswordResetNotification($token) { $this->notify(new MyResetPassword($token)); }
No olvides importar la clase use App\Notifications\MyResetPassword;
Crea la nueva notificación
En Laravel, una notificación está representada por una clase que se encuentra en App\Notifications
que sirven para notificar al usuario acerca de algo que ocurre en la aplicación, en nuestro caso, notificar al usuario por email de la solicitud de recuperación de contraseña. Para crearla ejecutamos:
php artisan make:notification MyResetPassword
De esta clase creada en el directorio App\Notificacions
ahora la extendemos de la clase Illuminate\Auth\Notifications\ResetPassword
y como nos interesa modificar solo el método toMail
, eliminamos los demás, pues quedarían igual como en la clase padre, por tanto, nuestra clase notificación estará de la siguiente manera:
<?php namespace App\Notifications; use Illuminate\Auth\Notifications\ResetPassword; use Illuminate\Notifications\Messages\MailMessage; class MyResetPassword extends ResetPassword { public function toMail($notifiable) { return (new MailMessage) ->line('You are receiving this email because we received a password reset request for your account.') ->action('Reset Password', route('password.reset', $this->token)) ->line('If you did not request a password reset, no further action is required.'); } }
Pero ahora dependiendo de la versión de Laravel con la cual estés trabajando podrás modificar el mensaje de la notificación.
Personaliza la notificación vía Mail para Laravel 5.4
En Laravel 5.4 tu método toMail
puede usar los métodos disponibles como subject
, greeting
, line
, action
, salutation
para escribir el mensaje de la siguiente manera:
public function toMail($notifiable) { return (new MailMessage) ->subject('Recuperar contraseña') ->greeting('Hola') ->line('Estás recibiendo este correo porque hiciste una solicitud de recuperación de contraseña para tu cuenta.') ->action('Recuperar contraseña', route('password.reset', $this->token)) ->line('Si no realizaste esta solicitud, no se requiere realizar ninguna otra acción.') ->salutation('Saludos, '. config('app.name')); }
Con esto ya tendríamos el email de recuperación de contraseña traducido, manteniendo la estructura del email que viene por defecto, pero si necesitas personalizar la plantilla del mensaje tendrás que publicarla ejecutando:
php artisan vendor:publish --tag=laravel-notifications
Con esto se publica la plantilla email.blade.php
en el directorio /resources/views/vendor/notifications
que permitirá modificarse según las necesidades. Esta plantilla usa el nuevo componente Markdown de Mailable en Laravel 5.4 para crear el mensaje, solo recuerda que ésta es la plantilla usada para todas notificaciones enviadas vía email.
Personaliza la notificación via Mail para Laravel 5.3
Para esta versión es totalmente necesario publicar la plantilla del email de notificaciones, puesto que el método salutation
no está disponible y quedaría sin personalizarse. Para publicarlo se usa el mismo comando:
php artisan vendor:publish --tag=laravel-notifications
Pero en Laravel 5.3 se publican dos archivos email-plain.blade.php
y email.blade.php
que usan Blade y estilos de CSS en línea para crear la plantilla del email. Entonces modifica la vista email.blade.php
para que se adapte a las necesidades de la aplicación.
Para luego escribir en la notificación:
public function toMail($notifiable) { return (new MailMessage) ->subject('Recuperar contraseña') ->greeting('Hola') ->line('Estás recibiendo este correo porque hiciste una solicitud de recuperacion de contraseña para tu cuenta.') ->action('Recuperar contraseña', url('password/reset', $this->token)) ->line('Si no realizaste esta solicitud, no se requiere realizar ninguna otra acción.') }
Resultado
Independiente de una versión u otra el email de la notificación será algo como:
Aún queda por traducir la última parte que se encuentra en la plantilla publicada email.blade.php
y además puedes continuar personalizando para agregar el logo de aplicación y cualquier otra información importante.
Espero este tutorial te haya gustado y sea útil, por favor ayúdanos a compartirlo en las redes sociales.
Material relacionado
- Registro, login y recuperación de contraseña con make:auth en Laravel 5.3
- Introducción al nuevo sistema de notificaciones de Laravel 5.3
- Uso de Markdown en los Mailables en Laravel 5.4
Regístrate hoy en Styde y obtén acceso a todo nuestro contenido.