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

Symfony предоставляет почтовую функцию, основанную на популярной библиотеке Swift Mailer через SwiftMailerBundle. Этот почтовый сервис поддерживает отправку сообщений с вашими собственными почтовыми серверами, а также с использованием поплулярных провайдеров почтового сервиса, вроде Mandrill, SendGrid, и Amazon SES.

Установка

В приложениях, использующих Symfony Flex, запустите эту команду, чтобы установить почтовый сервис, основанный на Swift Mailer, до того, как его использовать:

1
$ composer require mailer

Если ваше приложение не использует Symfony Flex, следуйте инструкциям по установке на SwiftMailerBundle.

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

Файл config/packages/swiftmailer.yaml, который создаётся при установке почтовой программы, предоставляет всю изначальную конфигурацию, необходимую для отправки писем, кроме деталей соединения с вашим почтовым сервером. Эти параметры определяются в переменной окружения MAILER_URL в файле .env:

1
2
3
4
5
# используйте это, чтобы отключить доставку писем
MAILER_URL=null://localhost

# используйте это, чтобы сконфигурировать традиционный SMTP-сервер
MAILER_URL=smtp://localhost:25?encryption=ssl&auth_mode=login&username=&password=

Обратитесь к справочнику конфигурации SwiftMailer, чтобы увидеть детальное объяснение всех доступных опций конфигурации.

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

Библиотека Swift Mailer работает путем создания, конфигурации и последующей отправки объектов Swift_Message. "Отправщик" ответственнен за действительную доставку сообщения и к нему можно получить доступ через сервис Swift_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
public function indexAction($name, \Swift_Mailer $mailer)
{
    $message = (new \Swift_Message('Hello Email'))
        ->setFrom('[email protected]')
        ->setTo('[email protected]')
        ->setBody(
            $this->renderView(
                // templates/emails/registration.html.twig
                'emails/registration.html.twig',
                array('name' => $name)
            ),
            'text/html'
        )
        /*
         * Если вы также хотите включить в сообщение версию обычного текста
        ->addPart(
            $this->renderView(
                'emails/registration.txt.twig',
                array('name' => $name)
            ),
            'text/plain'
        )
        */
    ;

    $mailer->send($message);

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

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
{# templates/emails/registration.html.twig #}
<h3>Вы сделали это! Вы зарегистрировались!</h3>

Привет, {{ name }}! Вы успешно зарегистрировались.

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

Спасибо!

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

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

Использование Gmail для отправки писем

Во время разработки, вы можете предпочесть отправлять письма, используя Gmail вместо установки обычного SMTP-сервера. Чтобы сделать это, обновите MAILER_URL вашего файла .env до следующего:

1
2
# имя пользователя - ваш полный почтовый адрес Gmail или Google Apps
MAILER_URL=gmail://username:[email protected]

Транспорт gmail это просто сокращение, которое использует транспорт smtp, шифрование ssl, режим авторизации``login`` и хост smtp.gmail.com. Если ваше приложение использует другое шифрование или режим авторизации, вам нужно переопределить эти значения (см. справочник конфигурации почтовой программы):

1
2
# имя пользователя - ваш полный почтовый адрес Gmail или Google Apps
MAILER_URL=gmail://username:[email protected]?encryption=tls&auth_mode=oauth

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

Использование облачных сервисов для отправки писем

Облачные почтовые сервисы являются популярной опцией для компаний, которые не хотят устанавливать и содержать собственные надёжные почтовые серверы. В приложениях Symfony, исползование таких сервисов так же просто, как обновление значения MAILER_URL в файле .env. Например, для Amazon SES (Simple Email Service):

1
2
3
# TХост будет отличаться, в зависимости от вашей зоны AWS
# Сертификаты имени пользователя / пароля добываются из консоли Amazon SES
MAILER_URL=smtp://email-smtp.us-east-1.amazonaws.com:587?encryption=tls&username=YOUR_SES_USERNAME&password=YOUR_SES_PASSWORD

Используйте ту же технику для всех других почтовых сервисов, так как в большинстве случаев, не требуется ничего, кроме конфигурации конечной точки SMTP.

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