SMTP — самый быстрый способ подключиться, если в проекте уже настроена отправка почты: обычно достаточно поменять хост, логин и пароль в конфигурации.
| Параметр | Значение |
|---|---|
| Сервер | smtp.fmailer.ru |
| STARTTLS | 587, 8587 |
| SSL/TLS | 465, 8465 |
| Без шифрования | 25, 8025 |
| Логин и пароль | логин и пароль токена домена |
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 должен принадлежать подтверждённому домену. Письмо с чужого домена будет отклонено — это защита от подделки отправителя.
Адрес конверта — то, что наши серверы ставят в 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 сообщил бы каждому читателю, кто ещё был в письме. Большинство почтовых библиотек убирают его сами — поэтому те, что не убирают, и остаются незамеченными: утечка доходит до ваших читателей, а не до вас. Скрытые получатели свои копии по-прежнему получают, исчезает только заголовок.
Если письма не уходят, начните с проверки самого соединения:
openssl s_client -starttls smtp -crlf -connect smtp.fmailer.ru:587Успешный ответ означает, что сервер доступен и TLS работает. Если соединение не устанавливается — скорее всего, исходящий SMTP закрыт на стороне вашего хостинга.
Готовые примеры конфигурации: Django, Laravel, Ruby on Rails, Express.js, Spring Boot и ASP.NET — в соседних разделах.