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
相关产品推荐
相关产品推荐

