Как работать с электронными письмами во время разработки

При разработке приложения, которое отправляет электронные письма, вам часто может не хотеться действительно отправлять письмо к обозначенному получателю во время разработки. Если вы используете почтовый сервис Symfony по умолчанию, вы с легкостью можете достичь этого через настройки конфигурации, не нуждаясь в каких-либо измнениях к вашем коде. Когда речь идёт об отправке электронных писем при разработке, существует два главных варианта: (а) полное отключение отправки всех электронных писем или (б) отправка всех электронных писем по определённому адресу (с необязательными исключениями).

Отключение отправки

Вы можете отключить отправку электронных писем, установив опцию disable_delivery, как true, что является значением, используемым Symfony по умолчанию в окружении test (письма будут продолжать отправляться в других окружениях):

  • YAML
    1
    2
    3
    # config/packages/test/swiftmailer.yaml
    swiftmailer:
        disable_delivery: true
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    <!-- config/packages/test/swiftmailer.xml -->
    <?xml version="1.0" encoding="UTF-8" ?>
    <container xmlns="http://symfony.com/schema/dic/services"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:swiftmailer="http://symfony.com/schema/dic/swiftmailer"
        xsi:schemaLocation="http://symfony.com/schema/dic/services
            http://symfony.com/schema/dic/services/services-1.0.xsd
            http://symfony.com/schema/dic/swiftmailer http://symfony.com/schema/dic/swiftmailer/swiftmailer-1.0.xsd">
    
        <swiftmailer:config disable-delivery="true" />
    </container>
    
  • PHP
    1
    2
    3
    4
    // config/packages/test/swiftmailer.php
    $container->loadFromExtension('swiftmailer', array(
        'disable_delivery' => "true",
    ));
    

Отправка на специальный(е) адрес(а)

Вы также можете решить, что все электронные письма должны отправляться на специальный адрес или несколько адресов вместо того, чтобы указывать адрес во время отправки письма. Это можено сделать с помощью опции delivery_addresses:

  • YAML
    1
    2
    3
    # config/packages/dev/swiftmailer.yaml
    swiftmailer:
        delivery_addresses: ['[email protected]']
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    <!-- config/packages/dev/swiftmailer.xml -->
    <?xml version="1.0" encoding="UTF-8" ?>
    <container xmlns="http://symfony.com/schema/dic/services"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:swiftmailer="http://symfony.com/schema/dic/swiftmailer"
        xsi:schemaLocation="http://symfony.com/schema/dic/services
            http://symfony.com/schema/dic/services/services-1.0.xsd
            http://symfony.com/schema/dic/swiftmailer
            http://symfony.com/schema/dic/swiftmailer/swiftmailer-1.0.xsd">
    
        <swiftmailer:config>
            <swiftmailer:delivery-address>[email protected]</swiftmailer:delivery-address>
        </swiftmailer:config>
    </container>
    
  • PHP
    1
    2
    3
    4
    // config/packages/dev/swiftmailer.php
    $container->loadFromExtension('swiftmailer', array(
        'delivery_addresses' => array("[email protected]"),
    ));
    

Теперь, представьте, что вы отправляете электронное письмо по адресу recipient@example.com в контроллере.:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
public function index($name, \Swift_Mailer $mailer)
{
    $message = (new \Swift_Message('Hello Email'))
        ->setFrom('[email protected]')
        ->setTo('[email protected]')
        ->setBody(
            $this->renderView(
                'HelloBundle:Hello:email.txt.twig',
                array('name' => $name)
            )
        )
    ;
    $mailer->send($message);

    return $this->render(...);
}

В окружении dev, письмо вместого этого будет отправлено на dev@example.com. Swift Mailer добавит дополнительный заголовок к письму, X-Swift-To, содержащий заменённые адреса, чтобы вы могли увидеть, кому было отправлено письмо.

Note

В дополнение к адресам to, это также остановит отправку электронного письма на любые установленные для него адреса CC и BCC. Swift Mailer добавит дополнительные заголовки к письму с переопределёнными в них адресами. Это будут X-Swift-Cc и X-Swift-Bcc для CC и BCC соответственно.

Отправка на специальный адрес, но с исключениями

Представьте, что вы хотите перенаправлять всю почту на специальный адрес (как в вышеописанном сценарии на dev@example.com). Но потом вам может понадобиться, чтобы электронное письмо, отправленное на какие-то специальные адреса, всё-таки прошло и не было перенаправлено (даже, если оно в окружении разработки). Это можно сделать, добавив опцию delivery_whitelist:

  • YAML
    1
    2
    3
    4
    5
    6
    7
    8
    # config/packages/dev/swiftmailer.yaml
    swiftmailer:
        delivery_addresses: ['[email protected]']
        delivery_whitelist:
           # все почтовые адреса, совпадающие с этими регулярными выражениями, будут доставлены
           # как обычно, а также отправлены на [email protected] [email protected]
           - '/@specialdomain\.com$/'
           - '/^[email protected]\.com$/'
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    <!-- config/packages/dev/swiftmailer.xml -->
    <?xml version="1.0" encoding="UTF-8" ?>
    <container xmlns="http://symfony.com/schema/dic/services"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:swiftmailer="http://symfony.com/schema/dic/swiftmailer"
        xsi:schemaLocation="http://symfony.com/schema/dic/services
            http://symfony.com/schema/dic/services/services-1.0.xsd
            http://symfony.com/schema/dic/swiftmailer
            http://symfony.com/schema/dic/swiftmailer/swiftmailer-1.0.xsd">
    
        <swiftmailer:config>
            <!-- все почтовые адреса, совпадающие с этими регулярными выражениями, будут доставлены
                 как обычно, а также отправлены на [email protected] [email protected] -->
            <swiftmailer:delivery-whitelist-pattern>/@specialdomain\.com$/</swiftmailer:delivery-whitelist-pattern>
            <swiftmailer:delivery-whitelist-pattern>/^[email protected]\.com$/</swiftmailer:delivery-whitelist-pattern>
            <swiftmailer:delivery-address>[email protected]</swiftmailer:delivery-address>
        </swiftmailer:config>
    </container>
    
  • PHP
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    // config/packages/dev/swiftmailer.php
    $container->loadFromExtension('swiftmailer', array(
        'delivery_addresses' => array("[email protected]"),
        'delivery_whitelist' => array(
            // все почтовые адреса, совпадающие с этими регулярными выражениями, будут доставлены
            // как обычно, а также отправлены на [email protected]
            '/@specialdomain\.com$/',
            '/^[email protected]\.com$/',
        ),
    ));
    

В вышеописанном примере, все электронные письма будут перенаправлены на dev@example.com, а сообщения, отправленные на адрес admin@mydomain.com или любые другие адреса, принадлежащие домену specialdomain.com будут также доставлены как обычно.

Caution

Опция delivery_whitelist игнорируется, кроме случаев, когда определена опция delivery_addresses.

Просмотр из панели инструментов веб-отладки

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

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

Вместо этого, вы можете установить опцию intercept_redirects как true в окружении dev, что приведёт к остановке перенаправления и позволит вам открыть отчёт со всеми деталями об отправленных письмах.

  • YAML
    1
    2
    3
    # config/packages/dev/swiftmailer.yaml
    web_profiler:
        intercept_redirects: true
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    <!-- config/packages/dev/swiftmailer.xml -->
    <?xml version="1.0" encoding="UTF-8" ?>
    <container xmlns="http://symfony.com/schema/dic/services"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:webprofiler="http://symfony.com/schema/dic/webprofiler"
        xsi:schemaLocation="http://symfony.com/schema/dic/services
            http://symfony.com/schema/dic/services/services-1.0.xsd
            http://symfony.com/schema/dic/webprofiler
            http://symfony.com/schema/dic/webprofiler/webprofiler-1.0.xsd">
    
        <webprofiler:config
            intercept-redirects="true"
        />
    </container>
    
  • PHP
    1
    2
    3
    4
    // config/packages/dev/swiftmailer.php
    $container->loadFromExtension('web_profiler', array(
        'intercept_redirects' => 'true',
    ));
    

Tip

В качестве альтернативы, вы можете открыть профилировщик после перенаправления и выполнить поиск по предоставленному URL, использованному в предыдущем запросе (например, /contact/handle). Функция поиска профилировщика позволяет вам загружать информацию профилировщика для любого предыдущего запроса.

Эта документация является переводом официальной документации Symfony и предоставляется по свободной лицензии CC BY-SA 3.0.