Symfony: регистрация всех писем, созданных Mailer - PullRequest
0 голосов
/ 06 февраля 2020

По разным причинам я хочу / нужно регистрировать все электронные письма, отправленные через мой веб-сайт, который работает на Symfony 5.

У меня есть подписчик, который создает объект типа EmailLogEntry, когда MessageEvent класс создан (по крайней мере, из этого я понимаю (MessageEvent::class) - поправьте меня, если я ошибаюсь). Я также использую этого подписчика для заполнения отсутствующих адресов электронной почты системным адресом по умолчанию.

Теперь, после отправки электронного письма, я хотел бы настроить свою сущность и позвонить $email->setSent(true);, но я не могу понять, как подписаться на событие, которое пытается отправить по электронной почте. И для повторного использования кода я не хочу делать это в Сервисах (да, это несколько, так как есть несколько источников, которые генерируют почту), где я на самом деле называю $this->mailer->send($email);.

Мои вопросы сейчас:

  • Может кто-нибудь сказать мне, как я могу подписаться на событие отправки Mailers?
  • Как, вообще, я могу выяснить, что события, на которые я могу подписаться? События ядра перечислены в документации, но как насчет всех других событий, которые запускаются?

Кстати, мой код подписчика на данный момент:

class SendMailSubscriber implements EventSubscriberInterface
    {
        public static function getSubscribedEvents()
        {
            return [
                MessageEvent::class => [
                    ['onMessage', 255],
                    ['logMessage', 0],
                ],
            ];
        }

        public function logMessage(MessageEvent $event) {
            $email = new EmailLogEntry();
            [...]
        }
    }

Спасибо.

1 Ответ

0 голосов
/ 11 февраля 2020

Ответ на мой вопрос: на данный момент вы не можете подписаться на событие send () Mailer.

В качестве временного решения, это мой код на данный момент: это выдержка из моей службы Mailer.

// send email and log the whole message
private function logSendEmail($email) {
    $log = new EmailLog();

    // sender
    $log->setSender(($email->getFrom()[0]->getName() ?:"")." <".$email->getFrom()[0]->getAddress().">");

    // get recipient list
    foreach($email->getTo() AS $to) {
        $recipient[] = "To: ".$to->getName()." <".$to->getAddress().">";
    }
    foreach($email->getCc() AS $cc) {
        $recipient[] = "CC: ".$cc->getName()." <".$cc->getAddress().">";
    }
    foreach($email->getBcc() AS $bcc) {
        $recipient[] = "Bcc: ".$bcc->getName()." <".$bcc->getAddress().">";
    }
    $log->setRecipient(implode(";",$recipient));

    // other message data
    $log->setSubject($email->getSubject());
    $log->setMessage(serialize($email->__serialize()));
    $log->setMessageTime(new \DateTime("now"));
    $log->setSent(0); // set Sent to 0 since mail has not been sent yet

    // try to send email
    try {
        $this->mailer->send($email);
        $log->setSent(1);   // set sent to 1 if mail was sent successfully
    }

//      catch(Exception $e) {
//          to be determined
//      }

    // and finally persist entity to database
    finally {
        $this->em->persist($log);
        $this->em->flush();
    }
}

EmailLog - это созданная мною сущность. При сохранении отправителя, получателей и темы сообщения наблюдается небольшой вылет. Однако, в соответствии с защитой данных потребителя, я планирую автоматически очищать поле сообщения через 30 дней, удерживая другие поля в течение 6 месяцев.

На данный момент я также не использую подписчика, в основном потому что посетители сайта могут запросить копию сообщения, и я не заинтересован в том, чтобы регистрировать это. Кроме того, поскольку я хочу создавать код многократного использования, в какой-то момент я могу столкнуться с проблемой того, что письма могут содержать личные сообщения, и я, конечно, не захочу регистрировать эти письма.

...