Мои проекты

Настраиваем обработчик писем и очистки

Ручной запуск, cron или существующий Celery: выбираем одно расписание и наблюдаем очередь.

Урок 8 / 22 · Commentail 1.3.2

Настроенная почта не отправляет очередь сама. Обработчик забирает задания из базы и удаляет просроченные временные записи. Запуск веб-сервера его не заменяет. Сначала проверьте ручной запуск:

sh
python manage.py process_commentail

Команду выполняйте из папки с manage.py, в окружении сайта, с теми же настройками и базой. Один запуск обрабатывает текущую порцию и завершается; это не постоянно работающий сервер.

Вариант без очереди задач

На Linux можно запускать команду раз в минуту через cron. Подготовьте доступный служебному пользователю каталог логов и используйте реальные пути:

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:

python
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 дополните существующий словарь расписания:

python
# 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 не гарантирует ровно одно письмо.

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

Документация по теме

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

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

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

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

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

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