返回介绍

利用 RQ 任务发送电子邮件

发布于 2025-01-02 21:54:01 字数 1927 浏览 0 评论 0 收藏 0

不要认为本节偏离主题,我在上面说过,当后台导出任务完成时,将使用包含所有用户动态的 JSON 文件向用户发送电子邮件。 我在 第十章 中构建的电子邮件功能需要通过两种方式进行扩展。 首先,我需要添加对文件附件的支持,以便我可以附加 JSON 文件。 其次, send_email() 函数总是使用后台线程异步发送电子邮件。 当我要从后台任务发送一封电子邮件时(已经是异步的了),基于线程的二级后台任务没有什么意义,所以我需要同时支持同步和异步电子邮件的发送。

幸运的是,Flask-Mail 支持附件,所以我需要做的就是扩展 send_email() 函数的默认关键字参数,然后在 Message 对象中配置它们。 选择在前台发送电子邮件时,我只需要添加一个 sync=True 的关键字参数即可:

app/email.py :发送带附件的邮件。

# ...

def send_email(subject, sender, recipients, text_body, html_body,
               attachments=None, sync=False):
    msg = Message(subject, sender=sender, recipients=recipients)
    msg.body = text_body
    msg.html = html_body
    if attachments:
        for attachment in attachments:
            msg.attach(*attachment)
    if sync:
        mail.send(msg)
    else:
        Thread(target=send_async_email,
            args=(current_app._get_current_object(), msg)).start()

Message 类的 attach() 方法接受三个定义附件的参数:文件名,媒体类型和实际文件数据。 文件名就是收件人看到的与附件关联的名称。 媒体类型定义了这种附件的类型,这有助于电子邮件读者适当地渲染它。 例如,如果你发送 image/png 作为媒体类型,则电子邮件阅读器会知道该附件是一个图像,在这种情况下,它可以显示它。 对于用户动态数据文件,我将使用 JSON 格式,该格式使用 application/json 媒体类型。 最后一个参数包含附件内容的字符串或字节序列。

简单来说, send_email()attachments 参数将成为一个元组列表,每个元组将有三个元素对应于 attach() 的三个参数。 因此,我需要将此列表中的每个元素作为参数发送给 attach() 。 在 Python 中,如果你想将列表或元组中的每个元素作为参数传递给函数,你可以使用 func(*args) 将这个列表或元祖解包成函数中的多个参数,而不必枯燥地一个个地传递,如 func(args[0], args[1], args[2]) 。 例如,如果你有一个列表 args = [1, 'foo']func(*args) 将会传递两个参数,就和你调用 func(1, 'foo') 一样。 如果没有 * ,调用将会传入一个参数,即 args 列表。

至于电子邮件的同步发送,我需要做的就是,当 syncTrue 的时候恢复成调用 mail.send(msg)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文