src/EventSubscriber/EmailSubscriber.php line 25
<?php
namespace App\EventSubscriber;
use App\Entity\App\Email;
use App\Repository\App\EmailRepository;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Mailer\Event\FailedMessageEvent;
use Symfony\Component\Mailer\Event\SentMessageEvent;
class EmailSubscriber implements EventSubscriberInterface
{
public function __construct(
private EmailRepository $emailRepository,
){}
public static function getSubscribedEvents(): array
{
return [
SentMessageEvent::class => 'onEmailSent',
FailedMessageEvent::class => 'onEmailFailed',
];
}
public function onEmailSent(SentMessageEvent $event): void
{
$message = $event->getMessage();
preg_match('/Subject: (.*)From:/sm', $message->getOriginalMessage()->toString(), $matches);
$subject = str_replace('=C3=A9?=', 'é', $matches[1]);
$email = (new Email())
->setDate(new \DateTime())
->setRecipients(implode(', ', array_map(fn($recipient) => $recipient->getAddress(), $message->getEnvelope()->getRecipients())))
->setSubject($subject)
->setStatus('sent')
;
$this->emailRepository->save($email, true);
}
public function onEmailFailed(FailedMessageEvent $event): void
{
$message = $event->getMessage();
$error = $event->getError();
preg_match('/Subject: (.*)From:/sm', $message->toString(), $matches);
$subject = str_replace('=C3=A9?=', 'é', $matches[1]);
$recipients = preg_match('/To: (.*)Subject:/sm', $message->toString(), $matches);
$email = (new Email())
->setDate(new \DateTime())
->setRecipients($recipients)
->setSubject($subject)
->setError($error->getMessage())
->setStatus('failed')
;
$this->emailRepository->save($email, true);
}
}