AWS SES: Captura los rebotes en Laravel 8

AWS SES

Captura los rebotes de AWS SES en Laravel 8

AWS SES – Hay quienes creen que, en la medida en que trabajan con AWS, no hay otra cosa más molestas que tener que cumplir con las mejores prácticas para detectar rebotes o quejas, y configurar un entorno agradable para detectarlos, mientras usa Servicio de correo electrónico simple de AWS.

No solo no puede salir del Sandbox si no cumple con las mejores prácticas para evitar el spam y la mala reputación al enviar correos, sino que se necesita un poco hasta que el equipo de soporte se asegura de que tiene una buena forma de atrapar rebotes o quejas, por lo que que pueden otorgarle el derecho de enviar correos electrónicos a cualquier persona.

Puede encontrarse con esto muchas veces, pero es imperioso tener una forma modular de resolver esto, sin demasiada codificación.

Conozca Laravel AWS Webhooks, un paquete de Laravel que viene con controladores con lógica empresarial incorporada que lo ayuda a escribir menos código para capturar mensajes SNS y escribir código que importa, como cancelar la suscripción de sus usuarios.

En esta publicación, aprenderá cómo hacer eso con Laravel, sin tener que escribir su lógica para capturar los mensajes SNS, enfocándose más en el código relevante que necesita implementar para cancelar la suscripción de sus usuarios.


Hay suficiente documentación en renoki-co/laravel-aws-webhooks sobre cómo instalar el paquete y configurar el controlador, por lo que nos centraremos en cómo configurar un tema SNS, una suscripción al controlador webhook y cómo agregar una configuración establecida para los correos electrónicos enviados a través de SES.


Todo lo que necesita es crear un nuevo controlador y ampliar el que viene con el paquete:

use RenokiCo\AwsWebhooks\Http\Controllers\SesWebhook;class MySesController extends SesWebhook
{
    /**
     * Handle the Bounce event.
     *
     * @param  array  $message
     * @param  array  $originalMessage
     * @param  \Illuminate\Http\Request  $request
     * @return void
     */
    protected function onBounce(array $message, array $originalMessage, Request $request)
    {
        //
    }
}

¡Solo eso! También tendrá que establecer una ruta en la que desea recibir los mensajes:

Route::any('/aws/sns/ses', [MySesController::class, 'handle']);

¡Asegúrese de agregar también la ruta a las excepciones en VerifyCsrfToken.php! La ruta de acceso es un conjunto arbitrario, pero puede ser cualquier cosa siempre que llame a la clase de controlador correcta y al método handle.


Ya existe una publicación de documentación de AWS sobre cómo crear un tema de SNS. Al crearlo, simplemente complete los nombres necesarios y siga todo el proceso de instalación con Siguiente – Siguiente – Siguiente – etc.

Al crear la suscripción HTTP (S), simplemente agregue el enlace que apunta directamente al enlace cuya ruta se definió anteriormente y asegúrese de NO marcar Entrega de mensajes sin procesar (Raw Message Delivery).

La suscripción se confirmará automáticamente, por lo que no necesitará escribir la lógica para eso también.


Ahora que está listo, con el SNS habilitado, deberá definir un conjunto de configuración para su dominio en SES.

Un conjunto de configuración es un conjunto de reglas para indicar qué deben hacer los correos electrónicos cuando se envían o cuando interactúan con los servidores de correo. Por ejemplo, puede decirle a su consola de Cloudwatch que muestre métricas en vivo con respecto al envío de correo o, en nuestro caso, que haga ping al tema de SNS con un mensaje sobre el estado del correo de un destinatario específico.

En la página de documentos de AWS encontrará una publicación sobre cómo configurar un conjunto de configuración para SES con SNS.

Cuando está definiendo los ajustes de configuración, puede elegir cualquier tipo de evento que se enviará a SNS, ya sea Bounce, Open o Click. El paquete admite los siguientes métodos, junto con el evento específico:

class MySesController extends SesWebhook
{
    /**
     * Handle the Bounce event.
     *
     * @param  array  $message
     * @param  array  $originalMessage
     * @param  \Illuminate\Http\Request  $request
     * @return void
     */
    protected function onComplaint(array $message, array $originalMessage, Request $request)
    {
        //
    }    protected function onDelivery(array $message, array $originalMessage, Request $request)
    {
        //
    }    protected function onSend(array $message, array $originalMessage, Request $request)
    {
        //
    }    protected function onReject(array $message, array $originalMessage, Request $request)
    {
        //
    }    protected function onOpen(array $message, array $originalMessage, Request $request)
    {
        //
    }    protected function onClick(array $message, array $originalMessage, Request $request)
    {
        //
    }    protected function onRenderingFailure(array $message, array $originalMessage, Request $request)
    {
        //
    }    protected function onDeliveryDelay(array $message, array $originalMessage, Request $request)
    {
        //
    }
}

El último detalle es definir una configuración establecida en config/services.php para la configuración de SES:

'ses' => [
    'key' => env('AWS_ACCESS_KEY_ID'),
    'secret' => env('AWS_SECRET_ACCESS_KEY'),
    'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
    'options' => [
        'ConfigurationSetName' => 'your-configuration-set',
    ],
],

¡Ya terminamos! Ahora podemos manejar las quejas de Bounce (rebote) en Laravel con un pequeño esfuerzo:

use RenokiCo\AwsWebhooks\Http\Controllers\SesWebhook;class MySesController extends SesWebhook
{
    /**
     * Handle the Bounce event.
     *
     * @param  array  $message
     * @param  array  $originalMessage
     * @param  \Illuminate\Http\Request  $request
     * @return void
     */
    protected function onBounce(array $message, array $originalMessage, Request $request)
    {
        // Unsubscribe the user from newsletter in case of bounce.        foreach ($message['bounce']['bouncedRecipients'] as $recipient) {
            if ($user = User::whereEmail($recipient['emailAddress'])->first()) {
                $user->update([
                    'subscribed' => false,
                ]);
            }
        }
    }
}

Este paquete también puede detectar el cambio de estado de las alarmas de Cloudwatch, pero es una historia realmente diferente, quizás para otro momento. Se basa en renoki-co/laravel-sns-events para capturar los mensajes SNS y transpilarlos en métodos fáciles de implementar. También puede verificar si desea capturar los eventos de SNS sin procesar y procesarlos usted mismo.

Recent Post