Enviar emails usando colas (queues) en Laravel

Laravel nos proveé una herramienta que son las colas o queues que nos permiten ejecutar procesos, que hacen que nuestra aplicación se ralentice, en background. Es decir, nos permite ponerlos en una cola de procesos y que se vayan ejecutando en background según van entrando a la cola, uno a uno. Así, al ejecutarse en background, se evita que nuestra aplicación se vea afectada, porque los procesos se ejecutarán por debajo, mientras nuestra aplicación continua con su ejecución.

Una vez entendemos para que sirven las colas, vamos a ver cómo aplicarlas al envío de mails.

Creamos el email:

Ejecutando este comando, Laravel nos creará en app/Mail un fichero TestMail.php que será el mail de prueba que vamos a utilizar para el ejemplo. Lo abrimos:

Creamos la vista del mail en resources/views/mails/test-mail.blade.php:

Como es un email de prueba, yo he puesto esto, pero podrías poner lo que quieras.

Una vez ya tenemos el email, tendremos que configurar el server de envío de correos. Yo lo tengo configurado con Mailtrap.io, pero lo podrías configurar con MailHog o cualquier otro servicio. Puedes echar un vistazo a esta entrada del blog para ver cómo hacerlo.

 

Ahora vamos a configurar las colas. Laravel nos proveé varios drivers para las colas. Algunos de ellos son Redis, sync, base de datos, entre otros. Para ver los diferentes drivers y sus configuraciones, puedes ir al archivo config/queue.php.

Yo voy a utilizar el driver de base de datos. Para ello, vamos al archivo .env y añadimos o modificamos la siguiente línea:

Tenemos que tener una tabla en la base de datos donde guardar los registros de la cola, para que los procesos se vayan completando uno a uno. Laravel tiene un comando que nos genera la migración de la tabla para las colas por nosotros:

Cuando ejecutemos la migración, nos creará una tabla en la base de datos llamada jobs, dónde se guardarán los registros de la cola.

 

Ya tenemos configuradas las colas. Ahora, lo que tenemos que hacer es enviar el mail creado anteriormente. Pero el proceso será que se añada la cola y luego se envíe, en vez de enviarlo directamente.

Vamos al controlador y añadimos lo siguiente:

Vamos a la ruta del controlador y si vamos a ver los registros de la tabla jobs, veremos que se ha añadido un registro pero que no se ha procesado. Para procesarlo, deberemos ejecutar otro comando de Laravel:

Podríamos configurar el número de veces que queremos que intente ejecutar un proceso añadiendo la opción –tries=[número de veces], el número de segundo que puede ejecutarse un proces con la opción –timeout=[número de segundos], entre otras opciones.

 

Si queremos ejecutar el comando anterior en background, lo podemos hacer con Supervisor que es un gestor de procesos para Linux. Para ello, lo primero que vamos a hacer va a ser instalarlo:

Cuando finalice la instalación, creamos un archivo en /etc/supervisor/conf.d/ con el nombre que quieras, pero tiene que tener la extensión .conf. Yo lo he llamado test-queue.conf y le añadimos lo siguiente:

Tendrás que cambiar las rutas para que funcione en tu sistema y los nombres también.

Arrancamos Supervisor y ya debería ejecutar el comando de Laravel para procesar las colas sin preocuparnos.

Para ver si se está ejecutando correctamente, podemos ejecutar el siguiente comando:

Este comando nos devolverá los procesos que se están ejecutando por Supervisor, su estado y el tiempo que lleva ejecutándose:

Para comprobar que funciona correctamente, vamos a la ruta y vemos si se procesan las colas. Si se procesa todo correctamente debería llegar el correo, sin tener que ejecutar el comando manualmente.

-


Aloja tu proyecto en DigitalOcean: Obtén $200 de crédito gratis al registrarte a través de este enlace.

Si hay cualquier tipo de error en el post o te surge cualquier duda, no dudes en ponerlo en los comentarios o enviarme un correo desde la página de contacto.

? CONTACTAR

Deja una respuesta

  Acepto la política de privacidad