Seleccionar página

En este post vamos a ver cómo se realiza el envío de emails con la nueva funcionalidad de Laravel 5.3: los Mailables.

En este caso, vamos a enviar un email al usuario que recién se acaba de registrar en nuestra aplicación para que active su cuenta. Para ello, haremos lo siguiente:

  • Crear una cuenta en Mailtrap.io o usar GMail en su lugar.
  • Guardar las credenciales en el archivo de variables de entorno de nuestra aplicación (.env).
  • Crear una clase para envio de emails usando mailables.
  • Crear una vista del email.
  • Crear la tabla para registrar las tareas y crear un job.
  • Despachar un Job (llamada al Job) que encole el email desde la funciones que lo requieran.
  • Procesar las tareas registradas en la tabla «jobs» de varias formas.
  • Crear una ruta necesaria para activar la cuenta de usuario.
  • Añadir una función al controlador TokenAuthController para cuando el usuario clique sobre el enlace contenido en el email que enviamos activemos la cuenta de usuario.

Primero registramos una cuenta en Mailtrap.io y luego en el Inbox, copiamos las credenciales y las ponemos en el archivo de variables de entorno Laravel, tal que:

Para el caso de GMail, estas son las variables a modo de ejemplo que hay que usar (siendo username, password,address y name, las que debes reemplazar por las tuyas):

Editamos el archivo de configuración de emails, tal que:

Editamos la migración de la tabla «users» para añadir el campo token de registro:

Editamos el modelo «User» para ocultar el campo creado y no se envíe en las peticiones:

Turno del mailable:

Abrimos y editamos la clase generada:

Creamos vista de prueba del email:

Vamos con las colas de Trabajo:

Editamos la configuración para guardar colas de trabajo en el archivo de variables añadiendo:

Creamos el job:

Editamos la clase generada:

Por último, la llamada al job desde el controlador «TokenAuthController» y su función «signup» que dejamos comentado en este post:

Nota: los jobs enviados a la cola son guardados como registros en la base de datos en la tabla «Jobs» y no se envian a «Mailtrap» en este caso.

Para procesar la cola, es decir, todos los emails de los usuarios que se guardaron en la tabla enviarlos a Mailtrap, tenemos varias opciones:

  • Desde el Terminal con un comando de Laravel.
  • Desde el Terminal con un comando personalizado.
  • Mediante una tarea programada (cron task) que ejecute la agenda (schedule) de Artisan desde el Terminal.
  • Mediante una tarea programada en tu servidor web (cuando esté la aplicación subida).

Procesar la cola con un comando personalizado:

Procesar la cola de tareas programadas de Artisan (Artisan scheduled tasks/commands):

Este último comando ejecutado desde el Terminal se quedará esperando y cada 1 minuto ejecutará la cola de tareas registradas en la base de datos en la tabla «jobs» de forma indefinida o hasta que cancelemos pulsando CTRL+C.

Por último, ¿cómo hacemos para que ese comando anterior se ejecute diariamente sin tener que abrir el Terminal y escribir el comando? Pues si estamos en desarrollo (development), podemos crear una tarea programada en Windows para que lo haga o si estamos en producción (production) podemos crear una tarea programada (cron job) en el servidor/hosting donde tengamos nuesta aplicación. El problema de la segunda opción es que es un servicio añadido y por tanto, hay que pagarlo.

Veamos como hacer una tarea programada en Windows(10). Abrir el Programador de tareas y hacer una que se repita diariamente, cada 1 minuto y cada 1 dia. Con la Accion siguiente:

Le ponemos un nombre a la tarea, por ejemplo «Artisan».

El desencadenador es 1 dia cada 1 minuto:

Y por último, la Acción. Ponemos lo siguiente en agregar argumentos: «C:\xampp\htdocs\keepme\artisan» schedule:run

Cuando el usuario pulse sobre el enlace dentro del email para activar su cuenta, Laravel recibirá la petición en la siguiente ruta «/account/activation/token_generado_por_el_job»:

Y gestionará la activación de la cuenta del usuario poniendo el campo «active» a 1 en la tabla «users»: