Anton Tarasyuk
Anton Tarasyuk

Reputation: 11

How get response after email message send. Symfony 4.3 mailer component

How get provider response result after mail send. For example i send message via symfony/mailgun and want to get message-uid from provider after sending message

   $email = (new Email())
        ->from('[email protected]')
        ->to('foo@bar')
        ->subject('Send email test')
        ->text('email text');

    $this->mailer->send($email); // is there any way to return response result instead void

Upvotes: 1

Views: 1997

Answers (1)

Hush
Hush

Reputation: 21

Facing the same issue I came up with following solution:

  1. 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;
    }
}
  1. Register it as a service:
    MessengerBundle\MessageHandler\SendEmailMessageHandler:
        autowire: true
        autoconfigure: true
        public: false
  1. 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.

Upvotes: 2

Related Questions