Мои проекты

Отдельная почта Commentail и сайта

Разделим почту сайта и Commentail: отдельные SMTP/API backend, отправитель, проверка обоих маршрутов и обработчик.

Первый запуск Commentail: сборка модуля комментариев на учебном сайте

Урок 23 / 23 · Commentail 1.4.1

Что настроим

Обычные письма сайта и уведомления Commentail могут использовать разные почтовые аккаунты и даже разные способы доставки. Здесь сохраним текущий транспорт сайта, а для Commentail зададим отдельный SMTP. Затем разберём альтернативу: сайт остаётся на SMTP, Commentail использует API Resend.

Перед началом

Нужен установленный Commentail 1.4.1, работающий сайт и его обычная почта. Для существующего проекта начните с 2. Подключаем Commentail к существующему Wagtail. Параметры SMTP и разрешённый отправитель разбираются в 6. Отправляем письма через SMTP; переменные окружения — в 5. Переменные окружения без путаницы с ключами. Обновление с прежней версии — в 20. Обновление и восстановление Commentail.

1. Передадим отдельные параметры

В локальном терминале macOS/Linux задайте значения ниже, заменив все YOUR_… параметрами своего провайдера. Пароль приложения отличается от пароля веб-входа. Адрес отправителя должен быть разрешён сервисом. Не используйте рабочие секреты для учебного опыта.

sh
export COMMENTAIL_SMTP_HOST='YOUR_SMTP_HOST'
export COMMENTAIL_SMTP_USERNAME='YOUR_SMTP_USERNAME'
export COMMENTAIL_SMTP_PASSWORD='YOUR_SMTP_APP_PASSWORD'
export COMMENTAIL_FROM_EMAIL='Comments <comments@YOUR_VERIFIED_DOMAIN>'

Для PowerShell используйте $env:ИМЯ = 'значение', как в уроке о переменных окружения. На сервере передайте эти же переменные через существующие настройки секретов и сайту, и worker. Django не загружает .env автоматически. Не печатайте словарь с паролем для проверки.

2. Добавим настройки рядом с COMMENTAIL

В активном файле настроек проекта добавьте следующий отдельный словарь. Сохраните прежние EMAIL_* и ANYMAIL: ими продолжает пользоваться обычная почта сайта. Не вкладывайте словарь в COMMENTAIL и не добавляйте секции hostname: маршрут общий для всех Site.

python
import os

# Keep the site's existing EMAIL_* and ANYMAIL settings.
COMMENTAIL_EMAIL = {
    "BACKEND": "django.core.mail.backends.smtp.EmailBackend",
    "OPTIONS": {
        "host": os.environ["COMMENTAIL_SMTP_HOST"],
        "port": 587,
        "username": os.environ["COMMENTAIL_SMTP_USERNAME"],
        "password": os.environ["COMMENTAIL_SMTP_PASSWORD"],
        "use_tls": True,
        "use_ssl": False,
        "timeout": 20,
    },
    "FROM_EMAIL": os.environ["COMMENTAIL_FROM_EMAIL"],
}

Это STARTTLS на порту 587. Для implicit TLS используйте порт провайдера, обычно 465, use_ssl=True и use_tls=False. Одновременно включать оба режима нельзя. Здесь явно заданы все параметры отдельного аккаунта: пропущенные SMTP-поля иначе наследуют соответствующие EMAIL_*. Один путь backend не изолирует учётные данные.

Имена внутри OPTIONS — аргументы конструктора, поэтому нужны host и username, а не EMAIL_HOST и EMAIL_HOST_USER. Непустой OPTIONS требует явного BACKEND. Опции backend и fail_silently зарезервированы.

3. Проверим оба маршрута

Перезапустите веб-приложение и worker. Из окружения сайта, в папке с manage.py, выполните проверку и прямую пробу, заменив адрес своим разрешённым получателем:

sh
python manage.py check
python manage.py test_commentail_email --to recipient@example.org

check проверяет структуру настроек и импорт backend без подключения к провайдеру. Проба отправляет одно обычное текстовое письмо сразу, без комментария, токена и очереди; она выполняется даже при выключенном Send emails. Успех означает принятие backend, поэтому отдельно проверьте отправителя, входящие и спам. Затем вызовите обычную почтовую функцию сайта, например восстановление пароля своей тестовой учётной записи: она должна сохранить прежнего провайдера и отправителя.

4. Пройдём письма от комментария до отписки

Включите Send emails для учебного Site. В приватном браузере отправьте допустимый гостевой текст, запустите python manage.py process_commentail. Проверьте подтверждение адреса кнопкой, письмо после одобрения ожидающего комментария при включённых Publication emails, отдельную ссылку редактирования, отклонение при включённых Rejection emails и уведомление о прямом опубликованном ответе с отпиской. Для отклонения нового гостевого текста используйте Review all: Reject-правило в Apply rules откажет раньше создания письма. Подробный путь — полный сценарий писем.

Проверьте Comments → Email delivery, события провайдера и полученные письма. Очередь и расписание остаются прежними; 8. Настраиваем обработчик писем и очистки.

Альтернатива: Commentail через Resend API

Используйте этот вариант вместо SMTP-словаря выше, если сайт должен остаться на своём SMTP. Подготовьте подтверждённый домен и ключ Resend с правом отправки по 7. Почтовый API Resend через Django Anymail. В окружении сайта установите Anymail, добавьте "anymail" один раз в существующий INSTALLED_APPS:

sh
python -m pip install django-anymail==15.2

Передайте COMMENTAIL_RESEND_API_KEY=YOUR_API_KEY и COMMENTAIL_FROM_EMAIL обоим процессам. Замените только COMMENTAIL_EMAIL следующим словарём; общий EMAIL_BACKEND и SMTP-параметры сайта сохраните:

python
import os

# Add "anymail" once to the existing INSTALLED_APPS.
COMMENTAIL_EMAIL = {
    "BACKEND": "anymail.backends.resend.EmailBackend",
    "OPTIONS": {
        "api_key": os.environ["COMMENTAIL_RESEND_API_KEY"],
        "requests_timeout": 20,
    },
    "FROM_EMAIL": os.environ["COMMENTAIL_FROM_EMAIL"],
}

Здесь api_key и requests_timeout — параметры Anymail, а не универсальные SMTP-опции. Соблюдайте ограничения аккаунта на получателя и отправителя. Перезапустите процессы и повторите обе проверки и полный сценарий. См. Resend backend Anymail 15.2 (на английском) и настройки экземпляра (на английском).

Ошибки, возврат к общей почте и очистка

При отказе отдельного backend Commentail не переключается на общий. Проверьте класс ошибки, наличие переменных без вывода значений, разрешённого отправителя и события провайдера. Исправление пароля не возвращает failed автоматически в очередь: используйте допустимый повтор в админке. Сроки ссылок при этом не продлеваются. При неопределённом результате повтор может дать дубль.

Ожидающие задания используют активный маршрут при обработке, даже если созданы раньше. Для возврата к общим настройкам удалите COMMENTAIL_EMAIL или задайте {}, затем перезапустите оба процесса. Допустима и смена одного отправителя: COMMENTAIL_EMAIL = {"FROM_EMAIL": "Comments <comments@example.org>"}. После опыта отзовите только выделенные тестовые ключи или пароли приложения, предварительно переключив сайт на рабочие настройки.

Другие уроки по этой задаче

Была ли статья полезна?

Комментарии 0

Имя: до 40 символов.

После отправки мы пришлём письмо со ссылкой для подтверждения email.

Не более 5000 символов.

Опубликованных комментариев пока нет.