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) |
Быстрый старт (на хосте)
- Создайте виртуальное окружение и установите зависимости:
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
- Скопируйте пример файла окружения и заполните учётные данные:
cp .env.example .env
- Отредактируйте
.env:
MAILEXAM_LOGIN=ВАШ_ЛОГИН
MAILEXAM_PASSWORD=ВАШ_ПАРОЛЬ
MAILEXAM_PORT=587
MAIL_FROM=noreply@example.test
- Примените миграции и запустите сервер:
python manage.py migrate
python manage.py runserver
По умолчанию сервер слушает http://127.0.0.1:8000.
- Отправьте тестовое письмо:
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_TLS — True. Для порта 25 — False.
Структура проекта
.
├── 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.
См. также
- Руководство Mailexam для Django (wiki)
- Flask и FastAPI — те же SMTP-параметры, другой стек
- Отправка почты в Django
- Документация API Mailexam
Лицензия
Apache 2.0