Документация / Drupal

Отправка почты в Drupal через SMTP

Штатный почтовый плагин Drupal передаёт письма функции PHP mail(), за которой на большинстве хостингов нет почтового сервера, а там, где есть, письмо уходит без авторизации и не проходит проверки SPF и DKIM. Ниже — как направить почтовую подсистему Drupal в fmailer.

Логин и пароль можно получить на странице управления токенами домена.

Параметры подключения

ПараметрЗначение
SMTP-хостsmtp.fmailer.ru
Порт587
ШифрованиеSTARTTLS (соединение переводится в TLS до авторизации)
ЛогинЛогин SMTP-токена вашего домена
ПарольПароль этого токена — показывается один раз, при создании
Каждый режим доступен и на высоком порту: 8465 (SSL/TLS), 8587 (STARTTLS) и 8025 (без шифрования). Многие хостинги и облака блокируют исходящие 25, 465 и 587 — если соединение отваливается по таймауту, используйте соответствующий высокий порт

Вариант 1 — SMTP Authentication Support

Давно существующий модуль с формой настроек по адресу /admin/config/system/smtp:

bash
composer require drupal/smtp
drush en smtp -y

Вместо заполнения формы переопределите настройки в settings.php, чтобы токен не попал в экспортируемую конфигурацию:

sites/default/settings.phpphp
<?php
// settings.php — доступы не должны попадать в экспортируемую конфигурацию.
$config['smtp.settings']['smtp_on'] = TRUE;
$config['smtp.settings']['smtp_host'] = 'smtp.fmailer.ru';
$config['smtp.settings']['smtp_port'] = '587';
$config['smtp.settings']['smtp_protocol'] = 'tls';   // 'tls' = STARTTLS, 'ssl' = порт 465
$config['smtp.settings']['smtp_username'] = getenv('SMTP_USER');
$config['smtp.settings']['smtp_password'] = getenv('SMTP_PASS');
$config['smtp.settings']['smtp_from'] = 'noreply@mail.example.ru';
$config['smtp.settings']['smtp_fromname'] = 'Магазин';
Доступы, введённые в форму модуля, сохраняются в конфигурации Drupal, которую большинство проектов экспортирует в код и коммитит. Переопределение в settings.php через переменную окружения оставляет токен вне репозитория.

Вариант 2 — Symfony Mailer Lite

Построен на Symfony Mailer и настраивается одной строкой DSN — удобнее, если вы уже знакомы с ним:

bash
composer require drupal/symfony_mailer_lite
drush en symfony_mailer_lite -y
sites/default/settings.phpphp
<?php
// settings.php — Symfony Mailer Lite настраивается одной строкой DSN.
// Символ @ в логине кодируется как %40.
$config['symfony_mailer_lite.settings']['default_transport'] = 'smtp';
$config['symfony_mailer_lite.transport.smtp']['configuration']['dsn'] =
  'smtp://token-login%40mail.example.ru:token-password@smtp.fmailer.ru:587';

Обратите внимание на %40: DSN — это URL, поэтому @ в логине токена нужно закодировать.

Адрес сайта

В разделе Конфигурация → Система → Основные настройки сайта укажите e-mail на подтверждённом домене. Если Drupal отправляет от одного домена, а DKIM и SPF опубликованы на другом, DMARC не сходится и письма фильтруются.

Проверка

bash
# Тестовое письмо через почтовую подсистему Drupal
drush php:eval "\Drupal::service('plugin.manager.mail')->mail('system', 'test', 'you@example.ru', 'ru', [], NULL, TRUE);"

# Какой почтовый плагин используется на самом деле
drush config:get system.mail

Разбор ошибок

СимптомПричина и решение
Настройки сохранены, но SMTP не используется Почтовым плагином владеет другой модуль. Проверьте drush config:get system.mail.
Таймаут подключения Порт заблокирован. Используйте 8587 (tls) или 8465 (ssl).
Ошибка авторизацииНеверные логин или пароль токена.
Ошибка SSL-рукопожатияssl на порту 587 или tls на 465.
Письма в спамеАдрес сайта не на подтверждённом домене.
Включены два SMTP-модуля Они борются за почтовый плагин. Оставьте только один.

Частые вопросы

Каким модулем отправлять почту через SMTP в Drupal?

Для Drupal 10 и 11 подойдёт либо SMTP Authentication Support (drupal/smtp) — давно существующий вариант с простой формой настроек, либо Symfony Mailer Lite, который использует Symfony Mailer и настраивается одной строкой DSN. Оба работают, но включать одновременно нельзя: каждый переопределяет почтовый плагин.

Почему Drupal не отправляет письма даже после включения модуля SMTP?

Посмотрите вывод drush config:get system.mail. Почтовым плагином может владеть другой модуль — Mime Mail, Swift Mailer или остаток от прежней настройки, — и тогда параметры модуля SMTP просто не читаются. На один ключ может быть только один активный плагин.

Где хранить пароль SMTP в Drupal?

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

Что указывать в smtp_protocol — tls или ssl?

tls вместе с портом 587: в этом модуле tls означает STARTTLS. ssl вместе с портом 465 — шифрование с первого байта. Несовпадение этих двух параметров и есть самая частая причина ошибки подключения.

Почему письма из Drupal попадают в спам?

Обычно из-за адреса сайта. Drupal берёт его из основных настроек, где нередко остаётся адрес на другом домене. Укажите адрес на подтверждённом домене, чтобы подпись DKIM и запись SPF сходились с отправителем.

Как увидеть настоящую ошибку SMTP в Drupal?

Включите отладку в настройках модуля SMTP и посмотрите сообщения на странице /admin/reports/dblog. Выключите её сразу после того, как подключение заработает: в отладочный журнал попадает и обмен при авторизации.

Что дальше