view gpp/mailer/__init__.py @ 505:a5d11471d031

Refactor the logic in the rate limiter decorator. Check to see if the request was ajax, as the ajax view always returns 200. Have to decode the JSON response to see if an error occurred or not.
author Brian Neal <bgneal@gmail.com>
date Sat, 03 Dec 2011 19:13:38 +0000
parents 767cedc7d12a
children
line wrap: on
line source
from socket import error as socket_error
import smtplib
import time
import logging

import django.core.mail

import mailer.models


def enqueue_mail(subject, message, from_email, recipient_list):
    """Creates mailer mail queue entries for the given email."""

    if len(subject) > mailer.models.MAX_SUBJECT:
        subject = u'%s...' % subject[:mailer.models.MAX_SUBJECT - 3]

    for recipient in recipient_list:
        mailer.models.Message(
                from_address=from_email,
                to_address=recipient,
                subject=subject,
                body=message).save()


def send_queued_mail():
    """Reads the queued messages from the database, sends them, and removes them
    from the queue."""

    sent, errors = 0, 0

    logging.debug("Sending queued mail...")
    start_time = time.time()

    msgs = mailer.models.Message.objects.all()
    for msg in msgs:
        try:
            django.core.mail.send_mail(
                    msg.subject,
                    msg.body,
                    msg.from_address,
                    [msg.to_address],
                    fail_silently=False)
        except (socket_error, smtplib.SMTPException), e:
            errors += 1
            logging.error("Error sending queued mail: %s", e)
        else:
            sent += 1
            msg.delete()

    end_time = time.time()
    logging.debug("Sent queued mail: %d successful, %d error(s); elapsed time: %.2f" % (
        sent, errors, end_time - start_time))