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

Отправление электронное почты - это классическое задание для любого веб-приложения, которое имеет особенные сложности и потенциальные подвохи. Вместо того, чтобы выдумывать колесо, одним из решений отправки писем является использование SwiftmailerBundle, который использует силу библиотеки Swift Mailer. Этот пакет включен в Symfony Standard Edition.

Конфигурация

Чтобы использовать Swift Mailer, вам понадобится сконфигурировать его для вашего почтового сервера.

Tip

Вместо того, чтобы устанавливать/использовать ваш собственный почтовый сервер, вы можете захотеть использовать провайдер почты вроде Mandrill, SendGrid, Amazon SES или дрегие. Они дают вам SMTP-сервер, имя пользователя и парль (иногда называется ключом), которые мгут быть использованы с конфигурацией Swift Mailer.

В стандартной установке Symfony, некоторые конфигурации swiftmailer уже включены:

  • YAML
    1
    2
    3
    4
    5
    6
    # app/config/config.yml
    swiftmailer:
        transport: '%mailer_transport%'
        host:      '%mailer_host%'
        username:  '%mailer_user%'
        password:  '%mailer_password%'
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    <!-- app/config/config.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
            transport="%mailer_transport%"
            host="%mailer_host%"
            username="%mailer_user%"
            password="%mailer_password%"
        />
    </container>
    
  • PHP
    1
    2
    3
    4
    5
    6
    7
    // app/config/config.php
    $container->loadFromExtension('swiftmailer', array(
        'transport'  => "%mailer_transport%",
        'host'       => "%mailer_host%",
        'username'   => "%mailer_user%",
        'password'   => "%mailer_password%",
    ));
    

Эти значения (например, %mailer_transport%), считывают параметры, которые установлены в файле parameters.yml. Вы можете изменять значения в этом файле или устанавливать их там напрямую.

Доступны следуюзие конфигурации атрибутов:

  • transport (smtp, mail, sendmail, или gmail)
  • username
  • password
  • host
  • port
  • encryption (tls, or ssl)
  • auth_mode (plain, login, or cram-md5)
  • spool
    • type (как определять очередь сообщений, поддерживаются file или memory, см How to Spool Emails)
    • path (где сохранять сообщения)
  • delivery_addresses (массив адресов электронной почты, куда отправляются ВСЕ письма)
  • disable_delivery (установите как "true" чтобы полностью отключить доставку)

Caution

Начиная с SwiftMailer 5.4.5, транспорт mail резко оспаривался, и будет удален в версии 6. Подумайте о том, чтобы использовать другой транспорт, вроде smtp, sendmail или gmail.

Отправка писем

Библиотека Swift Mailer работает путем создания, конфигурации и последующей отправки объектов Swift_Message. "Отправщик" ответственнен за действительную доставку сообщения и к нему можно получить доступ через сервис mailer. В общем, отправка электронного письма достаточно прямолинейна:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public function indexAction($name, \Swift_Mailer $mailer)
{
    $message = new \Swift_Message('Hello Email')
        ->setFrom('[email protected]')
        ->setTo('[email protected]')
        ->setBody(
            $this->renderView(
                // app/Resources/views/Emails/registration.html.twig
                'Emails/registration.html.twig',
                array('name' => $name)
            ),
            'text/html'
        )
        /*
         * Если вы также хотите включить вресию сообщения plaintext
        ->addPart(
            $this->renderView(
                'Emails/registration.txt.twig',
                array('name' => $name)
            ),
            'text/plain'
        )
        */
    ;

    $mailer->send($message);

    // или вы также можете вызвать сервис mailer таким образом
    // $this->get('mailer')->send($message);

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

Чтобы все было раздельно, тело письма было сохранено в щаблоне и отображено с помощью метода renderView(). Шаблон registration.html.twig может выглядеть как-то так:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
{# app/Resources/views/Emails/registration.html.twig #}
<h3>You did it! You registered!</h3>

Hi {{ name }}! You're successfully registered.

{# пример, предполагающий, что у вас есть маршрут под названием "login" #}
To login, go to: <a href="{{ url('login') }}">...</a>.

Thanks!

{# Создаёт абсолютный URL к /images/logo.png file #}
<img src="{{ absolute_url(asset('images/logo.png')) }}">

Объект $message поддерживает больше опций, таких как добавление вложений, добавление HTML-содержимого и многое другое. К счастью, в своей документации, Swift Mailer покрывает тему Создания сообщений в красочных деталях.

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