Queues: Envíe newsletters con colas de Laravel 8 y AWS

queues

Envíe Newysletters con colas (queues) de Laravel 8 y AWS

¿Alguna vez has oído hablar de los queues de Laravel? Los queues son las que impulsan la aplicación hacia un mejor rendimiento.

Muchas aplicaciones usan queues en producción porque ayudan a organizar el código (al separar fragmentos de código que se ejecutan en el envío) y pueden posponer el procesamiento para cualquier tarea que requiera mucho tiempo, como trabajar con API de terceros para SMS y correo, cuando no es necesario. para obtener una respuesta ahora mismo, pero para después.

Así es como la documentación oficial de Laravel define las colas:

 

Los queues de Laravel proporcionan una API unificada en una variedad de backends de queues diferentes, como Beanstalk, Amazon SQS, Redis o incluso una base de datos relacional. Los queues le permiten aplazar el procesamiento de una tarea que requiere mucho tiempo, como enviar un correo electrónico, para más adelante. Aplazar estas tareas que requieren mucho tiempo acelera drásticamente las solicitudes web a su aplicación.

 

Básicamente, esto es lo que desea hacer cuando no desea agregar tiempo de procesamiento adicional a su código y su respuesta no depende de esta tarea determinada. El envío de correos electrónicos, la confirmación de pagos y los webhooks deben realizarse mediante colas.

Hay a quienes les gustas usar queues siempre que tienen la oportunidad. Cuando tiene aplicaciones de múltiples inquilinos, por ejemplo, usar queues es la mejor manera de iniciar el comando migrate Artisan para migrar cada base de datos de inquilinos.


Como se ha dicho, si no está familiarizado con los queues, asegúrese de leer toda la documentación al respecto. Luego, asegúrese de tenerlos en funcionamiento. También es imprescindible que los trabajadores estén listos para procesar las instrucciones que enviaremos.

Deberíamos crear un trabajo que maneje nuestro código de envío de correo. El trabajo será el “mensaje” que enviamos a nuestros trabajadores, para que sepan qué procesar (nuestro envío de correo). Más tarde, si nuestro trabajo falla inesperadamente, podemos manejarlo.

Así que creémoslo. Abra la consola.

$ php artisan make:job SendNewsletterMailsJob

En su carpeta app/Jobs, encontrará un archivo SendNewsletterMailsJob.php, donde ocurre toda la magia.

Necesitamos enviar instrucciones a este trabajo de que queremos enviar correos electrónicos a todos nuestros usuarios suscritos, con un tema y contenido determinados. El trabajo es en realidad una clase en la que puede pasar variables al constructor. Entonces, pasaremos un asunto y contenido para nuestros correos electrónicos.

protected $subject;
protected $content;public function __construct($subject, $content) {
    $this->subject = $subject;
    $this->content = $content;
}public function handle() {
    foreach(User::all() as $user) {
    
        // Send emails to $user->email
        // using $this->subject & $this->content    }
}

Debe colocar su código en el método handle().


Ahora que tenemos el andamiaje del envío de correos electrónicos, deberíamos empezar un poco con Amazon SES.

Amazon SES (Simple Email Service) es un servicio confiable para enviar correos electrónicos. Posiblemente, piense que es difícil de configurar, pero usted tiene control total sobre sus correos, incluido el envío, la personalización, el acceso a otros microservicios de Amazon y, por último, pero no menos importante, el análisis y el seguimiento de los correos enviados.

Para enviar correos, debe registrar su propio dominio y luego crear sus direcciones de correo que luego se utilizarán para enviar correos.

Para hacerlo, visite la página de inicio de Amazon SES. Esta página conduce a la región de Irlanda, así que siéntase libre de elegir la región que desee en el menú superior derecho. Desde aquí, debe registrar su dominio en la sección Administración de identidad> Dominios. Agregue su propio dominio y luego obtendrá más instrucciones sobre cómo configurar sus registros DNS.

Si ha verificado su dominio y también ha verificado el DKIM, debe crear un dominio MAIL FROM. Puede crear un subdominio, ses.domain.com, por ejemplo, y debe crear registros DNS para verificarlo también. Esto nos ayudará a configurar nuestro nombre DE para nuestros correos electrónicos. Es bueno tener una identidad personalizada, ¿verdad?

Tenga en cuenta que en la parte superior de la página, tendrá un ARN de identidad. Lo necesitaremos para decirle a la API que estamos en ese dominio.

Después de configurar su dominio, vaya a la sección Administración de identidad > Direcciones de correo electrónico. A partir de ahí, agregue sus direcciones de correo electrónico. En este punto, estoy bastante seguro de que se ha familiarizado con él. Verifíquelo, verifique el DKIM, pero esta vez, para sus correos, no se requiere un dominio MAIL FROM.

Además, observe que en la página de cualquier dirección de correo electrónico registrada, tiene en la parte superior un ARN de identidad. Lo usaremos para que la API de Amazon sepa quiénes somos.

Si es nuevo en Amazon SES, se le pedirá que obtenga una tasa de envío más alta. Amazon suele poner este límite para evitar que alguien envíe spam utilizando un servicio como este, que, como has visto, era bastante fácil de configurar y poner en marcha. Puede solicitar una tasa más alta en la sección Envío de correo electrónico > Estadísticas de envío, desde donde puede decirle a Amazon por qué está utilizando Amazon SES.

La generación de claves para la API también es importante, así que entre. En el menú superior derecho, verifique en su cuenta My Security Credentials. Por ahora, si se le solicita que utilice IAM, omítalo por ahora. Recomiendo encarecidamente usar IAM, pero quiero mostrarlo de la manera más simple posible.

En la sección Access keys (ID de clave de acceso y clave de acceso secreta), cree una nueva clave de acceso. Tendrá un Access Key ID y una clave de acceso secreta (Secret Access Key). Esos dos se utilizarán para usar la API.


Para acceder a la API de Amazon, necesitamos el SDK de PHP oficial que se puede instalar con Composer:

$ composer require aws/aws-sdk-php

En nuestro trabajo, agregaremos un nuevo miembro de clase llamado $ses y en el constructor, inicializaremos nuestro constructor de servicios SES. Tu trabajo debería verse así. Asegúrese de agregar use Aws\Ses\SesClient; al principio del archivo.

protected $subject;
protected $content;
protected $ses;public function __construct($subject, $content) {
    $this->subject = $subject;
    $this->content = $content;
    $this->ses = SesClient::factory([
        'credentials' => [
            'key' => 'YOUR_SES_KEY',
            'secret' => 'YOUR_SECRET_KEY',
        ],
        'region' => 'eu-west-1',
        'version' => 'latest',
   ]);
}public function handle() {
    foreach(User::all() as $user) {
        $mail = $this->ses->sendEmail([
            'Source' => '[email protected] <John Doe>',
            'Destination' => [
                'ToAddresses' => [
                    '[email protected]',
                    '[email protected]',
                    ...
                ],
            ],
            'Message' => [
                'Subject' => [
                    'Data' => $this->subject,
                    'Charset' => 'utf-8',
                ],
                'Body' => [
                    'Html' => [
                        'Data' => $this->content,
                        'Charset' => 'utf-8',
                    ],
                ],
            ],
            'ReplyToAddresses' => [
                '[email protected]',
                '[email protected]',
                ...
            ],
            'ReturnPath' => '[email protected]',
            'SourceArn' => 'arn:aws:ses:eu-west-1:317451611313:identity/domain.com',
            'ReturnPathArn' => 'arn:aws:ses:eu-west-1:317451611313:identity/domain.com',
        ]);
    }
}

Recomiendo dejar la version más reciente y para encontrar su región, vuelva a Amazon y, en la URL, verifique el parámetro GET de la region. Ese valor debe colocarse en el campo de la region, en el constructor de API.

En la Source, puede pasar una dirección de correo electrónico o un nombre, en el formato email <name>. Su nombre se mostrará en cada correo enviado.

ReturnPath será el correo que recibirá notificaciones sobre los informes o, en caso de que el correo tenga problemas para enviarse, será devuelto. Esto puede ser un atrapador de correos electrónicos incorrectos.

SourceArnReturnPathArn son nuestros ARN mencionados anteriormente cuando creamos el dominio y la dirección de correo electrónico. Por último, pero no menos importante, ReplyToAddressesToAddresses son matrices y puede pasar tantas como desee, pero asegúrese de que no superen su Max Send Rate dentro del panel de Sending Statistics.


Ahora que hemos terminado de configurar Amazon SES, podemos enviar el trabajo cuando queramos, llamando a dispatch() y usando la clase de trabajo con los argumentos deseados pasados al constructor:

dispatch(new NewsletterJob($request->subject, $request->body));

Como pequeño consejo, si usa Redis, le recomiendo aumentar la variable retry_after en config/queue.php a algo más alto. Si el tiempo de ejecución del envío de correo pasa este número de segundos, el trabajo se reintentará. Si no enviamos boletines (newsletters) dentro del tiempo predeterminado (90 segundos), comenzará a analizar nuevamente a los usuarios y recibirá el boletín nuevamente.

No piense tonterías, así es como en realidad se pueden enviar 20 correos no deseados a cada usuario hasta darse cuenta de cuál era realmente el problema.


Al final, ahora es capaz de enviar boletines mediante Amazon Simple Email Service.

Recent Post