Урок 8 / 22 · Commentail 1.3.2
Настроенная почта не отправляет очередь сама. Обработчик забирает задания из базы и удаляет просроченные временные записи. Запуск веб-сервера его не заменяет. Сначала проверьте ручной запуск:
python manage.py process_commentail
Команду выполняйте из папки с manage.py, в окружении сайта, с теми же настройками и базой. Один запуск обрабатывает текущую порцию и завершается; это не постоянно работающий сервер.
Вариант без очереди задач
На Linux можно запускать команду раз в минуту через cron. Подготовьте доступный служебному пользователю каталог логов и используйте реальные пути:
* * * * * cd /srv/site && /srv/site/.venv/bin/python manage.py process_commentail >> /var/log/site/commentail.log 2>&1
/srv/site — пример корня проекта, .venv/bin/python — Python именно этого сайта. До добавления строки запустите такую команду вручную от пользователя службы. crontab -e открывает расписание текущего пользователя. Не устанавливайте задание от root только ради прав на папку.
Cron не наследует переменные из вашей интерактивной вкладки терминала. Подключите защищённое окружение тем способом, который уже использует хостинг, либо задайте расписание через панель, умеющую передавать Environment. Не вставляйте ключи в строку cron или публикуемый лог. Если окружение невозможно надёжно передать, используйте существующий планировщик службы.
На Windows учебный обработчик можно запускать вручную. Для постоянной работы задайте в Планировщике заданий повтор раз в минуту: программа — полный путь к Python окружения, аргументы — manage.py process_commentail, рабочая папка — каталог manage.py. Настройте учётную запись и окружение службы отдельно.
Если в проекте уже есть Celery
Не устанавливайте Celery только ради Commentail. В существующем приложении myapp добавьте tasks.py:
from celery import shared_task
from commentail.background import process_pending
@shared_task(name="myapp.process_commentail")
def process_commentail_task():
return process_pending(mail_limit=100)
При стандартной интеграции с namespace CELERY дополните существующий словарь расписания:
# Add to the existing schedule; preserve its other entries.
CELERY_BEAT_SCHEDULE["commentail-every-minute"] = {
"task": "myapp.process_commentail",
"schedule": 60.0,
}
Замените myapp на настоящее имя приложения в обоих фрагментах. Если расписания ещё нет, сначала создайте пустой словарь. Работать должны и worker Celery, и один beat. После перезапуска проверьте выполнение через реальный брокер, а не только прямой вызов функции. Интеграция Celery (на английском).
Выберите одно расписание: cron/панель либо host queue. process_pending(mail_limit=100) также можно вызвать из другой очереди после инициализации Django, с autocommit и вне transaction.atomic(). sent в результате — число принятых backend писем; removed — число удалённых просроченных неподтверждённых комментариев, не всех очищенных записей.
Как заметить остановку
Создайте тестовую гостевую отправку и дождитесь именно автоматического прохода. Следите за возрастом очереди и ошибками процесса. Временные сбои повторяются с задержками 1, 5 и 15 минут; ошибка шаблона требует исправления и ручного повтора. Задержка обработчика не продлевает срок подтверждения. При неопределённом результате отправки возможен дубль; Message-ID не гарантирует ровно одно письмо.
Другие уроки по этой задаче
- 6. Отправляем письма через SMTP
- 7. Почтовый API Resend через Django Anymail
- 21. Что делать, если комментарии не работают
Выберите способ входа или оставьте комментарий как гость ниже.