Beispiel #1
0
def send_all():
    """
    Send all eligible messages in the queue.
    """
    
    lock = FileLock("send_mail")
    
    logging.debug("acquiring lock...")
    try:
        lock.acquire(LOCK_WAIT_TIMEOUT)
    except AlreadyLocked:
        logging.debug("lock already in place. quitting.")
        return
    except LockTimeout:
        logging.debug("waiting for the lock timed out. quitting.")
        return
    logging.debug("acquired.")
    
    start_time = time.time()
    
    dont_send = 0
    deferred = 0
    sent = 0
    connection = None
    
    try:
        for message in prioritize():
            if DontSendEntry.objects.has_address(message.to_address):
                logging.info("skipping email to %s as on don't send list " % message.to_address)
                MessageLog.objects.log(message, 2) # @@@ avoid using literal result code
                message.delete()
                dont_send += 1
            else:
                try:
                    logging.info("sending message '%s' to %s" % (message.subject.encode("utf-8"), message.to_address.encode("utf-8")))
                    # Using EmailMessage instead of send_mail since that is basically all send_mail does.
                    if message.message_body_html is None or len(message.message_body_html) == 0:
                        logging.debug("message is text only")
                        msg = EmailMessage(message.subject, message.message_body, message.from_address, [message.to_address])
                    else:
                        logging.debug("message is text+html alternative")
                        msg = EmailMultiAlternatives(message.subject, message.message_body, message.from_address, [message.to_address])
                        msg.attach_alternative(message.message_body_html, "text/html")
                    if not DRY_RUN:
                        if connection is None:
                            # save the connection for possible reuse
                            connection = msg.get_connection()
                            logging.debug("got new conncetion")
                        if not SKIP_SEND:
                            msg.send()
                    MessageLog.objects.log(message, 1) # @@@ avoid using literal result code
                    message.delete()
                    sent += 1
                except (socket_error, smtplib.SMTPSenderRefused, smtplib.SMTPRecipientsRefused, smtplib.SMTPAuthenticationError), err:
                    message.defer()
                    connection = None # don't try to cache on error
                    logging.info("message deferred due to failure: %s" % err)
                    MessageLog.objects.log(message, 3, log_message=str(err)) # @@@ avoid using literal result code
                    deferred += 1
                if MAX_MESSAGES and MAX_MESSAGES == sent + deferred:
                    logging.info("stopped sending after reaching max of %d", MAX_MESSAGES)
                    break
    finally:
        logging.debug("releasing lock...")
        lock.release()
        logging.debug("released.")
    
    logging.info("")
    logging.info("%s sent; %s deferred; %s don't send" % (sent, deferred, dont_send))
    logging.info("done in %.2f seconds" % (time.time() - start_time))