Django письма электронной почты не отправляются с сельдереем - PullRequest
0 голосов
/ 10 января 2019

Я использую Django Mail Queue с Django 2.x

Приложение размещено на Heroku и использует redis backend для Сельдерей

Файл settings.py содержит

##################
# CELERY STUFF
##################
BROKER_URL = os.getenv('REDIS_URL', 'redis://localhost:6379')
CELERY_RESULT_BACKEND = os.getenv('REDIS_URL', 'redis://localhost:6379')
CELERY_ACCEPT_CONTENT = ['application/json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'

#######################
# Django mail queue
#######################
MAILQUEUE_CELERY = True
MAILQUEUE_QUEUE_UP = False

и отправка электронной почты как

new_message = MailerMessage()
new_message.subject = subject
new_message.to_address = to
new_message.from_address = from_email
new_message.content = text_content
new_message.html_content = html_content
new_message.app = 'Koober'
new_message.save()

При отправке электронного письма оно сохраняется в базе данных и отображается на странице администратора, но не отправляется.

Настройка MAILQUEUE_CELERY = False и MAILQUEUE_QUEUE_UP = False успешно отправляет электронную почту.

Но это приводит к сбою приложения в случае исключения. Вот почему я хочу использовать Сельдерей для отправки электронной почты в фоновом режиме.

enter image description here

приложение / celery.py

from __future__ import absolute_import
import os
from celery import Celery
from django.conf import settings

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'koober.settings')
app = Celery('koober')

app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)


@app.task(bind=True)
def debug_task(self):
    print('Request: {0!r}'.format(self.request))

1 Ответ

0 голосов
/ 10 января 2019

Из документации :

Задание cron можно настроить для работы одним из двух способов: с помощью управления команда или запрос HTTP. Оба метода запускают почтовую очередь, которая захватывает электронные письма и отправляет их. Чтобы уменьшить нагрузку, он только пытается отправить 30 электронных писем одновременно. Этот номер можно изменить с помощью MAILQUEUE_LIMIT в настройках

Идея состоит в том, что сообщения помещаются в очередь для отправки, и вы должны вручную вызывать работников для отправки сообщений. Предпочтительный метод - сделать это, выполнив команду управления send_queued_messages:

python manage.py send_queued_messages

Из вашего комментария:

Согласно этой строке в документации Вместо использования задания cron работник задачи сельдерея попытается отправить электронное письмо, когда оно будет сохранено. cron job уберет все потерянные письма. Мне не нужно запускать команда управления при MAILQUEUE_CELERY = True.

По умолчанию приложению не нужен сельдерей для работы. Он работает синхронно (в то же время) - так работает почтовый функционал django по умолчанию.

Как только приложение достигает кода для отправки почты, оно будет пытаться отправить почту и сделать паузу, пока не получит ответ, а затем продолжить с остальной частью запроса.

Другой вариант - отложить отправку электронного письма и вместо того, чтобы использовать тот же процесс, что и в Интернете, одновременно использовать вторичный процесс (рабочий). Это то, что происходит, когда вы устанавливаете MAILQUEUE_CELERY = True.

Если вы установили MAILQUEUE_QUEUE_UP = True, как вы сделали, теперь сообщения принимаются, но ставятся в очередь, и вы должны использовать команду управления или cron для отправки сообщений.

Итак, если вы хотите, чтобы сообщения отправлялись немедленно, установите MAILQUEUE_QUEUE_UP на False.

Если вы хотите отправлять сообщения пакетами с интервалами, установите MAILQUEUE_QUEUE_UP на True, а затем настройте задание cron для запуска команды управления.

...