You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flask-Email批量发送邮件时如何避免创建大量线程?

可以实现单个线程内批量发送邮件

当然可以通过传入邮件列表在单个线程内循环发送,避免创建大量线程。具体实现步骤如下:

1. 修改邮件发送逻辑,新增批量处理函数

首先新增一个处理邮件列表的异步函数,在单个线程内循环发送每封邮件:

def send_async_bulk_email(app, email_list):
    with app.app_context():
        for email_info in email_list:
            try:
                msg = Message(
                    email_info['subject'],
                    sender=email_info['sender'],
                    recipients=[email_info['recipient']]
                )
                msg.body = email_info['text_body']
                msg.html = email_info['html_body']
                mail.send(msg)
            except Exception as e:
                # 可根据需求添加日志记录或错误处理
                app.logger.error(f"发送邮件到 {email_info['recipient']} 失败: {str(e)}")
                continue

def send_bulk_email(email_list):
    # 仅创建单个线程处理所有邮件
    Thread(target=send_async_bulk_email, args=(app, email_list)).start()

2. 调整原有业务逻辑,收集邮件信息后批量发送

不再逐个调用send_email,而是先收集所有需要发送的邮件参数,再调用批量发送函数:

# 先收集所有待发送的邮件信息
email_list = []
for receiver in new_receivers:
    user = User.query.filter_by(organization=receiver).first()
    # 增加空值判断,避免无效邮箱导致报错
    if user and user.email:
        email_info = {
            'subject': 'You have new messages!',
            'sender': 'mail@mail.com',
            'recipient': user.email,
            'text_body': 'test',
            'html_body': 'test'
        }
        email_list.append(email_info)

# 当有邮件需要发送时,调用批量发送
if email_list:
    send_bulk_email(email_list)

说明

  • 这种方式只会创建单个线程处理所有邮件,避免了大量线程切换带来的资源开销。
  • 保留了异步发送的特性,不会阻塞Flask主请求的处理。
  • 加入了异常捕获,确保某一封邮件发送失败不会中断整个批量发送流程。

内容的提问来源于stack exchange,提问作者Tomas Am

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 19:48:45