Почтовый плагин в Strapi включён по умолчанию, но работает через провайдер sendmail, которому нужен почтовый сервер на той же машине. Официальный провайдер Nodemailer отправляет восстановление пароля, подтверждение регистрации и ваши собственные письма через fmailer.
| Параметр | Значение |
|---|---|
| SMTP-хост | smtp.fmailer.ru |
| Порт | 587 |
| Шифрование | STARTTLS (соединение переводится в TLS до авторизации) |
| Логин | Логин токена вашего домена |
| Пароль | Пароль этого токена — показывается один раз, при создании |
npm install @strapi/provider-email-nodemailerЛогин и пароль держите в переменных окружения:
SMTP_HOST=smtp.fmailer.ru
SMTP_PORT=587
SMTP_USERNAME=<логин токена>
SMTP_PASSWORD=<пароль токена> Затем подключите провайдер к плагину. В проекте на JavaScript тот же блок пишется в config/plugins.js через module.exports:
export default ({ env }) => ({
email: {
config: {
provider: "nodemailer",
providerOptions: {
host: env("SMTP_HOST"),
port: env.int("SMTP_PORT", 587),
secure: false, // STARTTLS на 587; true для 465
auth: {
user: env("SMTP_USERNAME"),
pass: env("SMTP_PASSWORD"),
},
},
settings: {
defaultFrom: "Магазин <noreply@mail.example.ru>",
defaultReplyTo: "support@mail.example.ru",
},
},
},
}); Адрес в defaultFrom должен быть на подтверждённом домене, иначе DKIM и SPF не сойдутся с отправителем. После изменения файла перезапустите Strapi.
Письма восстановления пароля и подтверждения адреса не используют defaultFrom. Откройте Settings → Users & Permissions plugin → Email templates и поправьте оба шаблона:
| Поле | Значение |
|---|---|
| Shipper name | Название вашего сервиса |
| Shipper email | noreply@mail.example.ru — на подтверждённом домене |
| Response email | Необязательно, например support@mail.example.ru |
// В контроллере, сервисе или lifecycle-хуке
await strapi.plugin("email").service("email").send({
to: order.customerEmail,
subject: `Подтверждение заказа №${order.id}`,
text: "Заказ принят. Доставка — завтра до 18:00.",
html: "<p>Заказ принят. Доставка — завтра до 18:00.</p>",
});В админке откройте Settings и в разделе Email plugin — страницу настроек. Там виден активный провайдер и есть кнопка Send test email. Затем запросите восстановление пароля для тестового пользователя, чтобы проверить и отправителя Users & Permissions.
| Симптом | Причина и решение |
|---|---|
На странице настроек по-прежнему sendmail | Конфигурация не внутри email.config или Strapi не перезапущен. |
| Провайдер не загружается при запуске | В проекте не установлен @strapi/provider-email-nodemailer. |
| Тест проходит, восстановление пароля — нет | В шаблонах Users & Permissions остался no-reply@strapi.io. |
Invalid login: 535 | Неверный логин или пароль токена в .env. |
| Таймаут подключения | Порт заблокирован. Используйте 8587 с secure: false или 8465 с secure: true. |
| Письма в спаме | Один из адресов отправителя не на подтверждённом домене. |
Установите @strapi/provider-email-nodemailer и укажите у плагина email провайдер nodemailer в config/plugins.js или config/plugins.ts, а в providerOptions — host, port, secure и auth. По умолчанию Strapi использует провайдер sendmail, которому нужен локальный почтовый сервер, а его на большинстве хостингов нет.
У плагина Users & Permissions свой отправитель для шаблонов Reset password и Email address confirmation, и по умолчанию это no-reply@strapi.io — defaultFrom из config/plugins его не переопределяет. Поменяйте Shipper email в обоих шаблонах на адрес на подтверждённом домене, иначе релей отклонит письмо или получатель сочтёт его поддельным.
В админке откройте Settings и в разделе Email plugin — страницу настроек. Там виден активный провайдер и есть кнопка Send test email. Тест использует defaultFrom, поэтому может пройти, даже если письма Users & Permissions по-прежнему уходят со своего отправителя.
false для порта 587: Nodemailer поднимает STARTTLS до авторизации. true для порта 465, где шифрование включается с первого байта. Перепутанные пары заканчиваются ошибкой TLS или таймаутом.
Вызовите strapi.plugin('email').service('email').send() с полями to, subject, text и html в контроллере, сервисе или lifecycle-хуке. from и replyTo необязательны и берутся из настроек config/plugins. Оборачивайте вызов в try/catch: неудачная отправка выбрасывает исключение.
На адрес из Settings → Users & Permissions plugin → Advanced settings → Reset password page. Своей публичной страницы сброса пароля для пользователей у Strapi нет — укажите страницу фронтенда, которая принимает код и задаёт новый пароль.