diff --git a/orchestra/contrib/mailer/engine.py b/orchestra/contrib/mailer/engine.py index 76697083..752c5a2b 100644 --- a/orchestra/contrib/mailer/engine.py +++ b/orchestra/contrib/mailer/engine.py @@ -7,18 +7,19 @@ from django.db.models import Q from django.utils import timezone from django.utils.encoding import smart_str -from orchestra.utils.sys import LockFile +from orchestra.utils.sys import LockFile, OperationLocked from . import settings from .models import Message -def send_message(message, num=0, connection=None, bulk=100): +def send_message(message, num=0, connection=None, bulk=settings.MAILER_BULK_MESSAGES): if num >= bulk and connection is not None: connection.close() connection = None if connection is None: - # Reset connection with django + # Reset connection with django + num = 0 connection = get_connection(backend='django.core.mail.backends.smtp.EmailBackend') connection.open() error = None @@ -34,19 +35,22 @@ def send_message(message, num=0, connection=None, bulk=100): message.log(error) -def send_pending(bulk=100): - with LockFile('/dev/shm/mailer.send_pending.lock'): - connection = None - num = 0 - for message in Message.objects.filter(state=Message.QUEUED).order_by('priority'): - send_message(message, num, connection, bulk) - num += 1 - now = timezone.now() - qs = Q() - for retries, seconds in enumerate(settings.MAILER_DEFERE_SECONDS): - delta = timedelta(seconds=seconds) - qs = qs | Q(retries=retries, last_retry__lte=now-delta) - for message in Message.objects.filter(state=Message.DEFERRED).filter(qs).order_by('priority'): - send_message(message, num, connection, bulk) - if connection is not None: - connection.close() +def send_pending(bulk=settings.MAILER_BULK_MESSAGES): + try: + with LockFile('/dev/shm/mailer.send_pending.lock'): + connection = None + num = 0 + for message in Message.objects.filter(state=Message.QUEUED).order_by('priority'): + send_message(message, num, connection, bulk) + num += 1 + now = timezone.now() + qs = Q() + for retries, seconds in enumerate(settings.MAILER_DEFERE_SECONDS): + delta = timedelta(seconds=seconds) + qs = qs | Q(retries=retries, last_retry__lte=now-delta) + for message in Message.objects.filter(state=Message.DEFERRED).filter(qs).order_by('priority'): + send_message(message, num, connection, bulk) + if connection is not None: + connection.close() + except OperationLocked: + pass diff --git a/orchestra/contrib/mailer/settings.py b/orchestra/contrib/mailer/settings.py index 2711cbb5..0cd6da8a 100644 --- a/orchestra/contrib/mailer/settings.py +++ b/orchestra/contrib/mailer/settings.py @@ -17,3 +17,8 @@ MAILER_NON_QUEUED_PER_REQUEST_THRESHOLD = Setting('MAILER_NON_QUEUED_PER_REQUEST 2, help_text=_("Number of emails that will be sent immediately before starting to queue them."), ) + + +MAILER_BULK_MESSAGES = Setting('MAILER_BULK_MESSAGES', + 500, +)