src/EventSubscriber/EmailSubscriber.php line 41

  1. <?php
  2. namespace App\EventSubscriber;
  3. use App\Entity\App\Email;
  4. use App\Repository\App\EmailRepository;
  5. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  6. use Symfony\Component\Mailer\Event\FailedMessageEvent;
  7. use Symfony\Component\Mailer\Event\SentMessageEvent;
  8. class EmailSubscriber implements EventSubscriberInterface
  9. {
  10.     public function __construct(
  11.         private EmailRepository $emailRepository,
  12.     ){}
  13.     public static function getSubscribedEvents(): array
  14.     {
  15.         return [
  16.             SentMessageEvent::class => 'onEmailSent',
  17.             FailedMessageEvent::class => 'onEmailFailed',
  18.         ];
  19.     }
  20.     public function onEmailSent(SentMessageEvent $event): void
  21.     {
  22.         $message $event->getMessage();
  23.         preg_match('/Subject: (.*)From:/sm'$message->getOriginalMessage()->toString(), $matches);
  24.         $subject str_replace('=C3=A9?=''é'$matches[1]);
  25.         $email = (new Email())
  26.             ->setDate(new \DateTime())
  27.             ->setRecipients(implode(', 'array_map(fn($recipient) => $recipient->getAddress(), $message->getEnvelope()->getRecipients())))
  28.             ->setSubject($subject)
  29.             ->setStatus('sent')
  30.         ;
  31.         $this->emailRepository->save($emailtrue);
  32.     }
  33.     public function onEmailFailed(FailedMessageEvent $event): void
  34.     {
  35.         $message $event->getMessage();
  36.         $error $event->getError();
  37.         preg_match('/Subject: (.*)From:/sm'$message->toString(), $matches);
  38.         $subject str_replace('=C3=A9?=''é'$matches[1]);
  39.         $recipients preg_match('/To: (.*)Subject:/sm'$message->toString(), $matches);
  40.         $email = (new Email())
  41.             ->setDate(new \DateTime())
  42.             ->setRecipients($recipients)
  43.             ->setSubject($subject)
  44.             ->setError($error->getMessage())
  45.             ->setStatus('failed')
  46.         ;
  47.         $this->emailRepository->save($emailtrue);
  48.     }
  49. }