Обновлено 2026-10-08

Как настроить отправку почты по SMTP в Django

Чтобы Django отправлял почту через SMTP-релей, укажите в settings.py EMAIL_BACKEND = django.core.mail.backends.smtp.EmailBackend, EMAIL_HOST = smtp.bulko.io, EMAIL_PORT = 587 и EMAIL_USE_TLS = True, а EMAIL_HOST_USER и EMAIL_HOST_PASSWORD берите из переменных окружения. В Django 6.1 и новее те же значения можно задать через новую настройку MAILERS.

Серверsmtp.bulko.io
Порт587 · 465 · 2525
ШифрованиеSTARTTLS · SSL
Логин и парольиз кабинета

Что указать в Django

ПолеЗначение
EMAIL_BACKENDdjango.core.mail.backends.smtp.EmailBackend
EMAIL_HOSTsmtp.bulko.io
EMAIL_PORT587 (или 2525; 465 только с EMAIL_USE_SSL)
EMAIL_USE_TLSTrue для 587 и 2525 (STARTTLS)
EMAIL_USE_SSLFalse для 587; True только для порта 465 (никогда вместе с TLS)
EMAIL_HOST_USERВаш SMTP-логин вида smtp_xxxxxxxxxxxxxxxx
EMAIL_HOST_PASSWORDВаш SMTP-пароль из переменной окружения
DEFAULT_FROM_EMAILАдрес на вашем домене, например Your App <[email protected]>
EMAIL_TIMEOUT30 (секунд; без него закрытый порт подвесит запрос)

Настройка по шагам

  1. Купите SMTP-пакет на странице Bulko SMTP Relay и скопируйте логин и пароль в разделе Dashboard -> SMTP Access.
  2. Сохраните их на сервере в переменных окружения, например SMTP_USERNAME и SMTP_PASSWORD, чтобы пароль не попал в репозиторий.
  3. В settings.py задайте EMAIL_BACKEND, EMAIL_HOST = "smtp.bulko.io", EMAIL_PORT = 587 и EMAIL_USE_TLS = True, а EMAIL_HOST_USER и EMAIL_HOST_PASSWORD читайте из os.environ.
  4. Включите ровно один флаг шифрования. EMAIL_USE_TLS означает STARTTLS (явный TLS) на 587 или 2525. EMAIL_USE_SSL означает неявный TLS на 465. Если оба равны True, Django выдаст ошибку.
  5. Укажите DEFAULT_FROM_EMAIL (используется, когда from_email равен None) и SERVER_EMAIL (отправитель писем об ошибках для ADMINS) на своём домене. Для выровненных SPF, DKIM и DMARC подтвердите домен в разделе Sending Domains личного кабинета Bulko.
  6. Добавьте EMAIL_TIMEOUT = 30, чтобы при закрытом порте Django падал с ошибкой, а не зависал на запросе.
  7. В Django 6.1 и новее можно перенести те же значения в MAILERS["default"]["OPTIONS"] (ключи host, port, use_tls, use_ssl, username, password, timeout) и удалить старые настройки EMAIL_*.

EMAIL_* или MAILERS в Django 6.1

В Django 6.1 появилась настройка MAILERS, а EMAIL_BACKEND, EMAIL_HOST, EMAIL_PORT, EMAIL_HOST_USER, EMAIL_HOST_PASSWORD, EMAIL_USE_TLS, EMAIL_USE_SSL и EMAIL_TIMEOUT объявлены устаревшими. Старые настройки работают с предупреждениями до Django 7.0. В блоке кода показаны оба варианта: используйте один из них. Про выбор порта подробнее в статье о SMTP-портах.

settings.py

# settings.py
import os

# Django 6.0 и ниже (в 6.1 тоже работает, но с предупреждениями об устаревании)
EMAIL_BACKEND = "django.core.mail.backends.smtp.EmailBackend"
EMAIL_HOST = "smtp.bulko.io"
EMAIL_PORT = 587
EMAIL_USE_TLS = True      # STARTTLS on 587 or 2525
EMAIL_USE_SSL = False     # для порта 465: EMAIL_USE_SSL = True, EMAIL_USE_TLS = False
EMAIL_HOST_USER = os.environ["SMTP_USERNAME"]
EMAIL_HOST_PASSWORD = os.environ["SMTP_PASSWORD"]
EMAIL_TIMEOUT = 30
DEFAULT_FROM_EMAIL = "Your App <[email protected]>"
SERVER_EMAIL = "[email protected]"

# Django 6.1+: те же параметры через MAILERS (вместо EMAIL_* выше)
# MAILERS = {
#     "default": {
#         "BACKEND": "django.core.mail.backends.smtp.EmailBackend",
#         "OPTIONS": {
#             "host": "smtp.bulko.io",
#             "port": 587,
#             "use_tls": True,
#             "username": os.environ["SMTP_USERNAME"],
#             "password": os.environ["SMTP_PASSWORD"],
#             "timeout": 30,
#         },
#     },
# }

# Проверка:
# python manage.py shell
# >>> from django.core.mail import send_mail
# >>> send_mail("Django SMTP test", "It works.", None, ["[email protected]"], fail_silently=False)
# 1

Проверка

Запустите python manage.py shell, импортируйте from django.core.mail import send_mail и вызовите send_mail("Django SMTP test", "It works.", None, ["[email protected]"], fail_silently=False). Возврат 1 означает, что релей принял одно письмо. Проверьте ящик и заголовки письма: оно должно пройти через smtp.bulko.io.

Во время проверки оставляйте fail_silently=False и передавайте его именованным аргументом (позиционная передача устарела в Django 6.0), тогда любая ошибка SMTP вылетит исключением с кодом ответа сервера.

Ошибки и решения

ПроблемаРешение
SMTPAuthenticationError: (535, ...)Неверный логин или пароль, либо переменные окружения не видны процессу Django. Проверьте в shell len(settings.EMAIL_HOST_PASSWORD). Подробнее: https://bulko.io/ru/smtp-errors/535/
ValueError: EMAIL_USE_TLS/EMAIL_USE_SSL are mutually exclusiveTrue может быть только один флаг. EMAIL_USE_TLS для 587 или 2525, EMAIL_USE_SSL для 465.
ssl.SSLError: wrong version numberПорт и флаг не совпадают: EMAIL_USE_SSL на 587 или EMAIL_USE_TLS на 465. Исправьте пару.
TimeoutError или запрос зависаетХостинг блокирует исходящие 587 и 465. Поставьте EMAIL_PORT = 2525 с EMAIL_USE_TLS = True и не убирайте EMAIL_TIMEOUT.
Письма печатаются в консоль, а не отправляютсяВ EMAIL_BACKEND стоит console backend (частая история в dev-настройках) или его перекрывает MAILERS. Проверьте, какой модуль настроек загружен.
SMTPDataError: (554, b'5.7.1 ...')Письмо отклонил ИИ-фильтр контента (фишинг, вредоносное ПО, имитация бренда, мошенничество). Проверьте текст, правила: https://bulko.io/ru/acceptable-use/

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

Что включать в Django: EMAIL_USE_TLS или EMAIL_USE_SSL?

Для порта 587 включайте EMAIL_USE_TLS = True (STARTTLS). EMAIL_USE_SSL = True нужен только для порта 465. Оба сразу включать нельзя.

EMAIL_HOST и EMAIL_PORT устарели?

В Django 6.1 они объявлены устаревшими в пользу MAILERS, но работают с предупреждениями до Django 7.0. В Django 6.0 и ниже других вариантов нет.

Можно ли получать ответы через этот SMTP-сервер?

Нет. Bulko SMTP работает только на отправку, без IMAP и ящика. Ответы приходят на адрес From или Reply-To.

Какой суточный лимит отправки?

По умолчанию 2 000 писем в сутки на один SMTP-аккаунт. Для увеличения напишите на [email protected].

Сколько это стоит?

Разовые пакеты: $5 за 5 000 писем, $15 за 20 000, $30 за 50 000, $60 за 150 000. Неиспользованные письма не сгорают, бесплатного пробного периода для SMTP нет.

Будут ли работать сброс пароля, django-allauth и письма об ошибках?

Да. Всё, что использует django.core.mail (сброс пароля, allauth, mail_admins), пойдёт через настроенный SMTP-бэкенд.

Получить SMTP-доступ для Django

Разовая оплата картой или криптой, без подписки. Неиспользованные письма не сгорают. Лимит 2 000 писем в сутки на один доступ.

SMTP Relay 5K: $5 · 5000SMTP Relay 20K: $15 · 20000SMTP Relay 50K: $30 · 50000SMTP Relay 150K: $60 · 150000
Тарифы SMTP-релея

Что можно отправлять: правила использования.