es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Symfony 5: enviar correos tanto sincrónicos como asíncronos en la aplicación.

Quiero enviar correos electrónicos en mi aplicación Symfony tanto en modo síncrono como asíncrono. Seguí la documentación de Symfony Messenger, pero tengo un problema con un parámetro clave: routing.

Con esta configuración, todos los mensajes se envían en cola.

Tengo 2 servicios donde envío correos electrónicos sincrónicos en el primero y asíncronos en el segundo:

<?php

namespace App\Service;

use Symfony\Component\Mime\Address;
use Symfony\Bridge\Twig\Mime\TemplatedEmail;
use Symfony\Component\Mailer\MailerInterface;

class MailManagerAsync
{
    protected $mailer;

    public function __construct(MailerInterface $mailer)
    {
        $this->mailer = $mailer;
    }

    protected function sendMessage($subject, $body, $bodyText, $to, $context=[])
    {
        $email = (new TemplatedEmail())
            ->from($this->from)
            ->to(new Address($to))
            ->subject($subject)

            // ruta de la plantilla Twig para renderizar
            ->htmlTemplate($body)
            ->textTemplate($bodyText)

            // pasar variables (nombre => valor) a la plantilla
            ->context($context)
        ;

        $this->mailer->send($email);
    }

    // función donde envío correos electrónicos

}

El segundo es igual que el primero, llamado MailManagerSync.

Ahora aquí está el problema:
cuando cambio el routing de esta manera:

routing: 'App\Service\MailManagerAsync': async

la aplicación envía 2 correos electrónicos, 1 en cola y uno enviado. Me gustaría enviar solo uno EN COLA.

¿Alguna sugerencia?

EDICIÓN: Entiendo que tengo que crear una clase de mensaje y enviarla al bus, pero: ¿hay alguna solución fácil para tener tanto correos electrónicos síncronos como asíncronos sin tener que desarrollar todo lo que mencioné anteriormente?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para tener tanto correos sincrónicos como asincrónicos sin tener que crear una clase de mensaje y enviarla al bus, puedes usar la opción sync en la configuración de enrutamiento en lugar de async. Esto te permitirá enviar correos electrónicos de forma sincrónica cuando utilices el servicio App\Service\MailManagerSync y de forma asincrónica cuando utilices App\Service\MailManagerAsync.

    Aquí tienes la configuración de enrutamiento actualizada:

    framework:
        messenger:
            transports:
                async: '%env(MESSENGER_TRANSPORT_DSN)%'
            routing:
                'App\Service\MailManagerSync': sync
                'App\Service\MailManagerAsync': async
    

    Con esta configuración, podrás utilizar ambos servicios MailManagerSync y MailManagerAsync para enviar correos electrónicos, y los correos enviados utilizando MailManagerSync se enviarán de forma sincrónica, mientras que los enviados utilizando MailManagerAsync se enviarán de forma asincrónica.

    ¡Espero que esto te ayude!

Comments are closed.