Facing the same issue I came up with following solution:
- Create your own handler for SendEmailMessage (inject original handler and use it's result for your purpose)
<?php
namespace MessengerBundle\MessageHandler;
use Symfony\Component\Mailer\Messenger\MessageHandler;
use Symfony\Component\Mailer\Messenger\SendEmailMessage;
use Symfony\Component\Mailer\SentMessage;
use Symfony\Component\Messenger\Handler\MessageHandlerInterface;
class SendEmailMessageHandler implements MessageHandlerInterface
{
/**
* @var MessageHandler
*/
private $defaultHandler;
/**
* SendEmailMessageHandler constructor.
* @param MessageHandler $defaultMessageHandler
*/
public function __construct(MessageHandler $defaultMessageHandler)
{
$this->defaultHandler = $defaultMessageHandler;
}
/**
* @param SendEmailMessage $message
* @return SentMessage|null
*/
public function __invoke(SendEmailMessage $message): ?SentMessage
{
$handler = $this->defaultHandler;
$sentMessage = $handler($message);
//your logic here
return $sentMessage;
}
}
- Register it as a service:
MessengerBundle\MessageHandler\SendEmailMessageHandler:
autowire: true
autoconfigure: true
public: false
- Replace original Symfony service with yours, otherwise mail will be sent twice (by original and your handlers):
mailer.messenger.message_handler:
class: MessengerBundle\MessageHandler\SendEmailMessageHandler
If this async approach don't fits to you, you can try this hack to extend mail service by adding getSentMessage into it.