首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用django-mailer定时发送电子邮件

如何使用django-mailer定时发送电子邮件
EN

Stack Overflow用户
提问于 2009-07-24 11:32:50
回答 2查看 4.1K关注 0票数 4

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

我需要的是能够在django-mailer的消息模型中设置一个'when_to_send‘字段,当cron任务触发send_mail函数时,它需要过滤出日期'when_to_send’大于当前时间的那些。

代码语言:javascript
运行
复制
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))

有没有人知道如何自定义这个函数,使其在message.when_to_send字段大于当前时间时不发送电子邮件?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-07-24 13:54:32

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

代码语言:javascript
运行
复制
         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 ...
票数 0
EN

Stack Overflow用户

发布于 2009-12-03 05:48:42

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

代码语言:javascript
运行
复制
* * * * * (cd $PINAX; /usr/local/bin/python2.5 manage.py send_mail >> $PINAX/cron_mail.log 2>&1)

然后在engine.py的第96行:

代码语言:javascript
运行
复制
   # 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()
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1177088

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档