Урок 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_… параметрами своего провайдера. Пароль приложения отличается от пароля веб-входа. Адрес отправителя должен быть разрешён сервисом. Не используйте рабочие секреты для учебного опыта.
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.
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, выполните проверку и прямую пробу, заменив адрес своим разрешённым получателем:
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:
python -m pip install django-anymail==15.2
Передайте COMMENTAIL_RESEND_API_KEY=YOUR_API_KEY и COMMENTAIL_FROM_EMAIL обоим процессам. Замените только COMMENTAIL_EMAIL следующим словарём; общий EMAIL_BACKEND и SMTP-параметры сайта сохраните:
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>"}. После опыта отзовите только выделенные тестовые ключи или пароли приложения, предварительно переключив сайт на рабочие настройки.
Выберите способ входа или оставьте комментарий как гость ниже.