Обновлено 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.
Что указать в Django
| Поле | Значение |
|---|---|
| EMAIL_BACKEND | django.core.mail.backends.smtp.EmailBackend |
| EMAIL_HOST | smtp.bulko.io |
| EMAIL_PORT | 587 (или 2525; 465 только с EMAIL_USE_SSL) |
| EMAIL_USE_TLS | True для 587 и 2525 (STARTTLS) |
| EMAIL_USE_SSL | False для 587; True только для порта 465 (никогда вместе с TLS) |
| EMAIL_HOST_USER | Ваш SMTP-логин вида smtp_xxxxxxxxxxxxxxxx |
| EMAIL_HOST_PASSWORD | Ваш SMTP-пароль из переменной окружения |
| DEFAULT_FROM_EMAIL | Адрес на вашем домене, например Your App <[email protected]> |
| EMAIL_TIMEOUT | 30 (секунд; без него закрытый порт подвесит запрос) |
Настройка по шагам
- Купите SMTP-пакет на странице Bulko SMTP Relay и скопируйте логин и пароль в разделе Dashboard -> SMTP Access.
- Сохраните их на сервере в переменных окружения, например
SMTP_USERNAMEиSMTP_PASSWORD, чтобы пароль не попал в репозиторий. - В
settings.pyзадайтеEMAIL_BACKEND,EMAIL_HOST = "smtp.bulko.io",EMAIL_PORT = 587иEMAIL_USE_TLS = True, аEMAIL_HOST_USERиEMAIL_HOST_PASSWORDчитайте изos.environ. - Включите ровно один флаг шифрования.
EMAIL_USE_TLSозначает STARTTLS (явный TLS) на 587 или 2525.EMAIL_USE_SSLозначает неявный TLS на 465. Если оба равны True, Django выдаст ошибку. - Укажите
DEFAULT_FROM_EMAIL(используется, когдаfrom_emailравенNone) иSERVER_EMAIL(отправитель писем об ошибках дляADMINS) на своём домене. Для выровненных SPF, DKIM и DMARC подтвердите домен в разделе Sending Domains личного кабинета Bulko. - Добавьте
EMAIL_TIMEOUT = 30, чтобы при закрытом порте Django падал с ошибкой, а не зависал на запросе. - В 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 exclusive | True может быть только один флаг. 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 писем в сутки на один доступ.
Что можно отправлять: правила использования.