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?
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 deasync
. Esto te permitirá enviar correos electrónicos de forma sincrónica cuando utilices el servicioApp\Service\MailManagerSync
y de forma asincrónica cuando utilicesApp\Service\MailManagerAsync
.Aquí tienes la configuración de enrutamiento actualizada:
Con esta configuración, podrás utilizar ambos servicios
MailManagerSync
yMailManagerAsync
para enviar correos electrónicos, y los correos enviados utilizandoMailManagerSync
se enviarán de forma sincrónica, mientras que los enviados utilizandoMailManagerAsync
se enviarán de forma asincrónica.¡Espero que esto te ayude!