Документация / Отправка через SMTP

Отправка через SMTP

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

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

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

ПараметрЗначение
Серверsmtp.fmailer.ru
STARTTLS587, 8587
SSL/TLS465, 8465
Без шифрования25, 8025
Логин и парольлогин и пароль токена домена
Порты 587 и 465 защищают соединение и передаваемые логин и пароль. Порты без шифрования оставлены для окружений, где TLS невозможен, — не используйте их в продакшене. Дублирующие порты (8587, 8465, 8025) помогают, если провайдер блокирует стандартные.

Пример на Python

send.pypython
import smtplib
from email.message import EmailMessage

msg = EmailMessage()
msg["From"] = "Магазин <noreply@mail.example.ru>"
msg["To"] = "client@example.ru"
msg["Subject"] = "Подтверждение заказа №4417"
msg.set_content("Заказ принят. Доставка — завтра до 18:00.")

with smtplib.SMTP("smtp.fmailer.ru", 587) as smtp:
    smtp.starttls()
    smtp.login("<логин токена>", "<пароль токена>")
    smtp.send_message(msg)

Отправитель

Адрес в поле From должен принадлежать подтверждённому домену. Письмо с чужого домена будет отклонено — это защита от подделки отправителя.

Куда приходят отказы (return path)

Адрес конверта — то, что наши серверы ставят в MAIL FROM, и куда почтовый сервер шлёт отложенный отказ, — по умолчанию совпадает с адресом в From вашего письма. Это необычно и сделано намеренно: конверт целиком ваш, SPF проверяется по вашему домену и выравнивается с From для DMARC. Большинство сервисов отправляют отказы через собственный домен.

Проблема возникает с noreply@. Если вы отправляете с адреса, который никто не читает, все отказы, пришедшие уже после передачи письма, падают именно туда. Задайте домену return path — и мы будем использовать этот адрес: тот, который вы действительно читаете.

Адрес должен быть на самом домене, а не на поддомене: SPF проверяется по домену из адреса конверта, а запись SPF вы публиковали на корне домена. Для поддомена проверка ушла бы туда, где записи SPF нет, — и проходившая почта тихо перестала бы проходить.

Заголовок Return-Path при этом по-прежнему не пишется: его добавляет тот сервер, который доставляет письмо получателю, и берёт из конверта. Письмо, пришедшее с уже проставленным Return-Path, считается некорректным.

Несколько получателей

Письмо, адресованное нескольким людям, превращается в системе в отдельное письмо на каждого получателя — и для To, и для Cc, и для Bcc. У каждого свой Message-ID, свой вебхук доставки и своё место в лимитах тарифа: именно поэтому отказ, открытие или отписку можно отнести к конкретному человеку. Не более 100 получателей на письмо; следующему адресу сервер ответит 452 4.5.3 Too many recipients — это просьба отправить остальных отдельной транзакцией, а не отказ в письме.

Заголовок Bcc мы удаляем при приёме, как и положено серверу отправки (RFC 5321 §7.2). Скрытые получатели уже есть в конверте, поэтому уцелевший Bcc сообщил бы каждому читателю, кто ещё был в письме. Большинство почтовых библиотек убирают его сами — поэтому те, что не убирают, и остаются незамеченными: утечка доходит до ваших читателей, а не до вас. Скрытые получатели свои копии по-прежнему получают, исчезает только заголовок.

Проверка соединения

Если письма не уходят, начните с проверки самого соединения:

bash
openssl s_client -starttls smtp -crlf -connect smtp.fmailer.ru:587

Успешный ответ означает, что сервер доступен и TLS работает. Если соединение не устанавливается — скорее всего, исходящий SMTP закрыт на стороне вашего хостинга.

Настройка во фреймворках

Готовые примеры конфигурации: Django, Laravel, Ruby on Rails, Express.js, Spring Boot и ASP.NET — в соседних разделах.