Django + Mailexam

Минимальный пример Django, который отправляет тестовое письмо через SMTP Mailexam с помощью django.core.mail.

Основан на руководстве Mailexam для Django.

Что понадобится

  • Аккаунт Mailexam и проект с SMTP-учётными данными.
  • Python 3.10+ и pip.

Из приветственного письма или личного кабинета Mailexam:

Переменная Описание
MAILEXAM_LOGIN SMTP-логин (например, xxxxx)
MAILEXAM_PASSWORD SMTP-пароль (пара к логину)
Хост {MAILEXAM_LOGIN}.mailexam.ru (формируется в config/settings.py)

Быстрый старт (на хосте)

  1. Создайте виртуальное окружение и установите зависимости:
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
  1. Скопируйте пример файла окружения и заполните учётные данные:
cp .env.example .env
  1. Отредактируйте .env:
MAILEXAM_LOGIN=ВАШ_ЛОГИН
MAILEXAM_PASSWORD=ВАШ_ПАРОЛЬ
MAILEXAM_PORT=587
MAIL_FROM=noreply@example.test
  1. Примените миграции и запустите сервер:
python manage.py migrate
python manage.py runserver

По умолчанию сервер слушает http://127.0.0.1:8000.

  1. Отправьте тестовое письмо:
curl -X POST http://127.0.0.1:8000/mail/test \
  -H 'Content-Type: application/json' \
  -d '{"to":"user@example.test","subject":"Тест","body":"Привет"}'

Письмо появится в личном кабинете Mailexam → ваш проект → входящие.

Альтернатива через Django shell

python manage.py shell
from django.core.mail import send_mail

send_mail(
    "Django + Mailexam",
    "Тест Mailexam из Django",
    None,
    ["user@example.test"],
)

Переменные окружения

Переменная Обязательна По умолчанию Описание
MAILEXAM_LOGIN да SMTP-логин; также используется для формирования имени хоста
MAILEXAM_PASSWORD да SMTP-пароль
MAILEXAM_PORT нет 587 SMTP-порт (587, 2525 или 25)
MAIL_FROM нет noreply@example.test Адрес отправителя (подойдёт любой тестовый)
HTTP_HOST нет 127.0.0.1 Адрес привязки HTTP (Docker)
HTTP_PORT нет 8000 Порт HTTP
ALLOWED_HOSTS нет 127.0.0.1,localhost Разрешённые хосты Django через запятую

Для порта 587 и 2525 EMAIL_USE_TLSTrue. Для порта 25False.

Структура проекта

.
├── requirements.txt
├── config/settings.py          # настройки SMTP Mailexam
├── mailapp/views.py            # POST /mail/test
├── manage.py
├── .env.example
├── Dockerfile                  # только для локальной отладки
└── docker-compose.yml

Docker (отладка)

Docker предназначен для локальной отладки. Для повседневной разработки запускайте приложение на хосте (см. выше).

cp .env.example .env
# отредактируйте .env с учётными данными

docker compose up --build

Затем вызовите тот же endpoint на проброшенном порту:

curl -X POST http://127.0.0.1:8000/mail/test \
  -H 'Content-Type: application/json' \
  -d '{"to":"user@example.test","subject":"Тест","body":"Привет"}'

Внутри контейнера сервер слушает 0.0.0.0:8000.

CI

Задайте эти секреты в окружении CI:

variables:
  MAILEXAM_LOGIN: $MAILEXAM_LOGIN
  MAILEXAM_PASSWORD: $MAILEXAM_PASSWORD
  MAILEXAM_PORT: "587"
  MAIL_FROM: "noreply@example.test"

После отправки письма в тесте проверьте доставку через API Mailexam.

Для unit-тестов без сети используйте EMAIL_BACKEND = "django.core.mail.backends.locmem.EmailBackend".

Типичные проблемы

Ошибка TLS или подключения

  • EMAIL_HOST должен быть {логин}.mailexam.ru, совпадая с EMAIL_HOST_USER / MAILEXAM_LOGIN.
  • Логин и пароль должны быть из одного проекта Mailexam.

Порт 587

  • Включите EMAIL_USE_TLS = True.

Настройки не применились

  • Перезапустите runserver после изменения .env или settings.py.

Письмо не в кабинете

  • Откройте входящие того же проекта Mailexam.
  • Убедитесь, что EMAIL_BACKEND не переопределён на console или file backend.

См. также

Лицензия

Apache 2.0