【问题标题】:Sending welcome emails asynchronously in python Flask application在 python Flask 应用程序中异步发送欢迎电子邮件
【发布时间】:2013-10-18 20:47:10
【问题描述】:

当他/她第一次登录(fb auth)到我们的烧瓶应用程序时,我正在尝试向用户发送一封欢迎电子邮件。

所以我正在考虑将 flask-mail 用于电子邮件框架和 celery(用于 rabbitmq 的 python 客户端)作为任务队列。

所以我有一个简单的电子邮件框架:

from flask.ext.mail import Message
from app import mail

    def send_email(subject, sender, recipients, text_body, html_body):
        msg = Message(subject, sender = sender, recipients = recipients)
        msg.body = text_body
        msg.html = html_body
        mail.send(msg)

我一直在阅读 celery 文档 - 但我不确定如何创建发送电子邮件所需的任务。我知道 Flask-mail 需要 Flask 应用程序上下文才能正常工作。然后我也需要 celery 的 celery 实例。那应该是烧瓶应用程序的一部分吗?简而言之,我正在寻找一些指导。在此先感谢您的帮助。

【问题讨论】:

  • 您可能需要检查The Flask Mega-Tutorial, Part XI: Email SupportPython 中的异步调用 部分。
  • 或者,查看 exim。它是一个用作邮件服务器的软件。您可以将其配置为接受邮件,然后将其异步放入队列并将其发送到另一个真正的邮件服务器。否则,您通常会询问如何创建 celery 任务来发送电子邮件。你已经描述了一些很有可能的事情。 Celery 任务可以导入 Flask 应用程序并创建上下文。您在这里应该没有问题。

标签: python asynchronous flask rabbitmq celery


【解决方案1】:

您可以使用Grinberg's tutorial中所示的线程来完成此操作

from threading import Thread

def threading(f):
    def wrapper(*args, **kwargs):
        thr = Thread(target=f, args=args, kwargs=kwargs)
        thr.start()
    return wrapper

@threading
def send_email(subject, to, body, html=None):
    def send():
        try:
            mail.send(msg)
        except Exception as err:
            app.logger.error("Error during mail send: {0}".format(err))

    with app.app_context():
        msg = Message(subject, recipients=[to], body=body, html=html,
                      sender="welcome@myapp.net")

        send()

然后在您看来,您可以拨打send_email 而不必等待

如果您想为电子邮件合并反馈(即实时信息,以防发送电子邮件时出现错误),您应该在实现中添加一个消息代理(即 rabbitmq、zeromq)和一个任务队列(即 celery) (以及一种异步轮询来自 UI 的消息的方法)。虽然我不认为你真的需要这样的欢迎电子邮件——除非你分批发送,你可以找到一个如何使用这些东西的例子here

【讨论】:

    猜你喜欢
    • 2016-08-04
    • 2015-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 2017-03-12
    • 1970-01-01
    相关资源
    最近更新 更多