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

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

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

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

Вы можете отключить отправу электронных писем, установив опцию disable_delivery как true. Она по умолчаниваю находится в окружении test в стандартной версии Symfony. Если вы сделаете это в специальной конфигурации test, тогда электронное письмо не будет отправлено при тестировании, но будет отправляться в окружениях prod и dev:

  • YAML
    1
    2
    3
    # app/config/config_test.yml
    swiftmailer:
        disable_delivery:  true
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    <!-- app/config/config_test.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
    // app/config/config_test.php
    $container->loadFromExtension('swiftmailer', array(
        'disable_delivery'  => "true",
    ));
    

Если вы также хотите отключить доставку в окружении dev, просто добавьте такую же конфигурацию в файл config_dev.yml.

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

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

  • YAML
    1
    2
    3
    # app/config/config_dev.yml
    swiftmailer:
        delivery_addresses: ['[email protected]']
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    <!-- app/config/config_dev.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
    // app/config/config_dev.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 indexAction($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
    # app/config/config_dev.yml
    swiftmailer:
        delivery_addresses: ['[email protected]']
        delivery_whitelist:
           # все адреса электронной почты, соответствующие этим регулярным выражениям, будут доставлены
           # как и обычно, так же, как и отправлены на [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
    19
    <!-- app/config/config_dev.xml -->
    
    <?xml version="1.0" charset="UTF-8" ?>
    <?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] -->
            <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
    // app/config/config_dev.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 будут также доставлены как обычно.

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

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

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

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

  • YAML
    1
    2
    3
    # app/config/config_dev.yml
    web_profiler:
        intercept_redirects: true
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    <!-- app/config/config_dev.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
    // app/config/config_dev.php
    $container->loadFromExtension('web_profiler', array(
        'intercept_redirects' => 'true',
    ));
    

Tip

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

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