代码之家  ›  专栏  ›  技术社区  ›  espenhogbakk

如何安排与Django Mailer的电子邮件发送

  •  3
  • espenhogbakk  · 技术社区  · 16 年前

    我正在制作一个django应用程序,它需要能够发送电子邮件,然后在给定的时间发送出去。我在想我可以用Django Mailer把东西放进Que然后寄出去。但即使他们的示例案例列表列出了这是一个特性,我似乎也不知道如何。

    我需要的是能够在Django Mailer的消息模型中设置一个“何时发送”字段,当cron作业触发发送邮件功能时,这需要过滤掉那些“何时发送”日期大于当前时间的邮件…

    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
    
        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")))
                        core_send_mail(message.subject, message.message_body, message.from_address, [message.to_address])
                        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()
                        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
        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))
    

    有人知道如何自定义此功能,使其不发送邮件。何时“发送到”字段大于当前时间?

    2 回复  |  直到 16 年前
        1
  •  0
  •   shawnr    16 年前

    您只需在消息处理循环下的条件中添加另一个子句(您还需要在文件顶部导入datetime):

             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
                elif message.when_to_send > datetime.datetime.now():
                    continue
                else:
                    try:
                      ... the rest of your code ...
    
        2
  •  3
  •   Adam Nelson    15 年前

    您需要为实现cron作业 django-mailer :

    * * * * * (cd $PINAX; /usr/local/bin/python2.5 manage.py send_mail >> $PINAX/cron_mail.log 2>&1)
    

    然后在 engine.py 第96行:

       # Get rid of "while True:"
       while not Message.objects.all():
            # Get rid of logging.debug("sleeping for %s seconds before checking queue again" % EMPTY_QUEUE_SLEEP)
            # Get rid of sleep
            send_all()