Update code and readme
This commit is contained in:
parent
ab8ea0a307
commit
975d3f5fee
39
README.md
39
README.md
@ -1,2 +1,41 @@
|
|||||||
# django-queued-mailer
|
# django-queued-mailer
|
||||||
|
|
||||||
Django mail backend uses celery as email message queue
|
Django mail backend uses celery as email message queue
|
||||||
|
|
||||||
|
### requirements
|
||||||
|
|
||||||
|
Django >= 1.11, Celery >= 4.1.1
|
||||||
|
|
||||||
|
### setup
|
||||||
|
|
||||||
|
- add `git+https://github.com/jar3b/django-queued-mailer.git` to requirements.txt
|
||||||
|
- install package `pip install --upgrade git+https://github.com/jar3b/django-queued-mailer.git`
|
||||||
|
- run celery worker
|
||||||
|
|
||||||
|
```
|
||||||
|
celery -A project worker
|
||||||
|
```
|
||||||
|
|
||||||
|
### run one task at time (optional)
|
||||||
|
|
||||||
|
- setup Celery routes
|
||||||
|
|
||||||
|
```
|
||||||
|
app.conf.task_queues = (
|
||||||
|
Queue('default', Exchange('default'), routing_key='default'),
|
||||||
|
Queue('qmailer_mail_queue', routing_key='qmailer.send.#'),
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
- start separate worker
|
||||||
|
|
||||||
|
```
|
||||||
|
celery -A project worker -Q qmailer_mail_queue --concurrency=1
|
||||||
|
```
|
||||||
|
|
||||||
|
### configure
|
||||||
|
|
||||||
|
Django settings:
|
||||||
|
|
||||||
|
- `QMAILER_EMAIL_BACKEND` - set email backend, default `django.core.mail.backends.smtp.EmailBackend`
|
||||||
|
- `QMAILER_TASK_QUEUE_NAME` - queue name for routing, default `default`, if you use separate "serial" worker as described above, you need to specify this option
|
@ -1,9 +1,8 @@
|
|||||||
from django.core.mail.backends.base import BaseEmailBackend
|
from django.core.mail.backends.base import BaseEmailBackend
|
||||||
from django.utils.encoding import force_text
|
from django.utils.encoding import force_text
|
||||||
from django.utils.module_loading import import_string
|
|
||||||
|
|
||||||
from .logger import logger
|
from .logger import logger
|
||||||
from .settings import EMAIL_SEND_TASK
|
from .tasks import send_message
|
||||||
|
|
||||||
|
|
||||||
def _get_message_recipients(email_message):
|
def _get_message_recipients(email_message):
|
||||||
@ -14,17 +13,14 @@ def _get_message_recipients(email_message):
|
|||||||
|
|
||||||
|
|
||||||
class EmailBackend(BaseEmailBackend):
|
class EmailBackend(BaseEmailBackend):
|
||||||
task = None
|
|
||||||
|
|
||||||
def __init__(self, fail_silently=False, **kwargs):
|
def __init__(self, fail_silently=False, **kwargs):
|
||||||
super(EmailBackend, self).__init__(fail_silently, **kwargs)
|
super(EmailBackend, self).__init__(fail_silently, **kwargs)
|
||||||
self.task = import_string(EMAIL_SEND_TASK)
|
|
||||||
|
|
||||||
def send_messages(self, email_messages):
|
def send_messages(self, email_messages):
|
||||||
num_sent = 0
|
num_sent = 0
|
||||||
for email in email_messages:
|
for email in email_messages:
|
||||||
try:
|
try:
|
||||||
self.task.apply_async([email, ])
|
send_message.apply_async([email, ])
|
||||||
num_sent += 1
|
num_sent += 1
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error("cannot send message %s: %r" % (_get_message_recipients(email), e))
|
logger.error("cannot send message %s: %r" % (_get_message_recipients(email), e))
|
||||||
|
@ -6,8 +6,8 @@ EMAIL_BACKEND = getattr(
|
|||||||
"django.core.mail.backends.smtp.EmailBackend"
|
"django.core.mail.backends.smtp.EmailBackend"
|
||||||
)
|
)
|
||||||
|
|
||||||
EMAIL_SEND_TASK = getattr(
|
TASK_QUEUE_NAME = getattr(
|
||||||
settings,
|
settings,
|
||||||
"QMAILER_SEND_TASK",
|
"QMAILER_TASK_QUEUE_NAME",
|
||||||
"queued_mailer.tasks.send_message"
|
"default"
|
||||||
)
|
)
|
||||||
|
@ -1,11 +1,19 @@
|
|||||||
from celery.task import task
|
from time import sleep
|
||||||
|
|
||||||
from .logger import logger
|
import celery
|
||||||
from .settings import EMAIL_BACKEND
|
from celery.utils.log import get_task_logger
|
||||||
|
|
||||||
|
from .settings import TASK_QUEUE_NAME
|
||||||
|
|
||||||
|
logger = get_task_logger(__name__)
|
||||||
|
|
||||||
|
|
||||||
@task
|
@celery.task(bind=True, queue=TASK_QUEUE_NAME, acks_late=True, default_retry_delay=30)
|
||||||
def send_message(email):
|
def send_message(self, email):
|
||||||
logger.info('TASK CALLED')
|
logger.info('task started')
|
||||||
logger.info(EMAIL_BACKEND)
|
try:
|
||||||
logger.info(email)
|
sleep(5)
|
||||||
|
logger.info('task success')
|
||||||
|
except Exception as e:
|
||||||
|
logger.info('task error')
|
||||||
|
raise self.retry(exc=e)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user