Symfony: Электронная почта в тестовом режиме: укажите в электронном письме, куда действительно будет отправлено письмо

Когда я отправлял электронные письма с помощью symfony 3.4 и swiftmailer, я могу установить параметр, чтобы вместо этого отправлять все электронные письма на определенный адрес электронной почты (имеет смысл в среде разработки):

swiftmailer:
    delivery_address: "[email protected]"

Теперь в самом письме я не вижу, куда бы оно отправилось, если бы этот параметр не был установлен. Я мог бы посмотреть в заголовке на переменную X-Swift-To, но это очень утомительно ...

Я бы хотел получить простую информацию в качестве первой строки в теле письма, что-то вроде

This email would be sent to [email protected] in production

Как я могу этого добиться? Есть ли какая-то конфигурация swiftmailer для этого? Потому что, когда я настроил swiftmailer и отправил электронное письмо, у меня нет возможности узнать, куда на самом деле будет отправлено электронное письмо ...

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
0
0
66
1

Ответы 1

Я создал сервис, который за меня обрабатывает такие вещи:

<?php

namespace AppBundle\Util;

use Doctrine\ORM\EntityManager;
use Symfony\Component\Templating\EngineInterface;
use Swift_Mailer;

use AppBundle\Entity\User;

class MailService
{
    private $em;
    private $templating;
    private $mailer;
    private $env;

    public function __construct(EntityManager $entityManager, EngineInterface $templating, Swift_Mailer $mailer,$env)
    {
        $this->em = $entityManager;
        $this->templating = $templating;
        $this->mailer = $mailer;
        $this->env = $env;
    }

    private function doSend($subject, $to, $template, $vars = array())
    {
        $message = \Swift_Message::newInstance();

        $body = $this->templating->render($template, $vars);

        $message->setSubject($subject)
                ->setFrom("[email protected]")
                ->setTo($to)
                ->setBody(
                    $body,
                    "text/html"
                );

        if ($this->env != "prod") // Redirect mails in dev/staging environments
        {
            $message->setSubject("[".$this->env." ".$to."] ".$subject);
            $message->setTo("[email protected]"); // hardcoded for my case, could be changed to config parameter though...
        }

        $this->mailer->send($message);
    }

    public function Send($subject, $to, $template, $vars = array())
    {
        $type = gettype($to);

        switch($type)
        {
            case "string":
                $this->doSend($subject, $to, $template, $vars);
                break;
            case "array":
                foreach($to as $t)
                {
                    $this->Send($subject, $to, $template, $vars);
                }
                break;
            case "object":
                if ($to instanceof User)
                {
                    $this->Send($subject, $to->getEmail(), $template, $vars);
                } elseif (is_iterable($to))
                {
                    foreach($to as $t)
                    {
                        $this->Send($subject, $t, $template, $vars);
                    }
                }
                break;
            default:
                throw \Exception("Unknown Recipient Type.");
        }
    }
}

Затем я могу использовать $this->get("my.mailer")->Send($subject, $recipient, $template, $templateVars); (я использую шаблоны веточек для своих писем)

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

Обратите внимание, что я добавил несколько дополнительных проверок, чтобы позволить $recipient быть сущностью User или массивом писем / сущностей.

Другие вопросы по теме