高效邮件发送系统设计与实现:基于Python和SQLAlchemy的实践

高效邮件发送系统设计与实现:基于Python和SQLAlchemy的实践
个人名片

🎓作者简介:java领域优质创作者
🌐个人主页码农阿豪
📞工作室:新空间代码工作室(提供各种软件服务)
💌个人邮箱:[[email protected]]
📱个人微信:15279484656
🌐个人导航网站:www.forff.top
💡座右铭:总有人要赢。为什么不能是我呢?
  • 专栏导航:
码农阿豪系列专栏导航
面试专栏:收集了java相关高频面试题,面试实战总结🍻🎉🖥️
Spring5系列专栏:整理了Spring5重要知识点与实战演练,有案例可直接使用🚀🔧💻
Redis专栏:Redis从零到一学习分享,经验总结,案例实战💐📝💡
全栈系列专栏:海纳百川有容乃大,可能你想要的东西里面都有🤸🌱🚀

目录

高效邮件发送系统设计与实现:基于Python和SQLAlchemy的实践

引言

在现代Web应用中,邮件通知是不可或缺的功能之一。无论是订单确认、文件处理结果通知,还是系统告警,邮件都是最常用的通信方式之一。本文将详细介绍如何基于 Python、SQLAlchemy 和 SMTP 协议,构建一个高效、可靠的邮件发送系统。我们将从需求分析、数据库设计、代码实现到优化策略,一步步实现一个支持附件发送、多收件人管理的邮件服务。


1. 需求分析

我们的系统需要满足以下核心需求:

  1. 多收件人支持:
    • 支持直接指定收件人邮箱(如 receiver_email)。
    • 支持通过 user_id 查询关联的用户邮箱(存储在 User 表中)。
    • 自动去重,避免重复发送。
  2. 附件发送:
    • 支持发送文件附件(如CSV、Excel等)。
    • 确保附件读取和发送的稳定性。
  3. 错误处理与日志:
    • 记录邮件发送状态(成功/失败)。
    • 提供详细的错误日志,便于排查问题。
  4. 性能优化:
    • 避免重复构建邮件内容。
    • 支持批量发送,减少SMTP连接开销。

2. 数据库设计

邮件发送系统通常需要关联用户数据,因此我们使用 SQLAlchemy 定义数据模型:

2.1 User 表(存储用户信息)

from flask_sqlalchemy import SQLAlchemy db = SQLAlchemy()classUser(db.Model): __tablename__ ='user'id= db.Column(db.Integer, primary_key=True) email = db.Column(db.String(120), nullable=False, unique=True) username = db.Column(db.String(80), nullable=False)# 其他字段...

2.2 CustomerOrder 表(关联用户订单)

classCustomerOrder(db.Model): __tablename__ ='customer_order'id= db.Column(db.Integer, primary_key=True) user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False) tracking_number = db.Column(db.String(50), nullable=False) order_number = db.Column(db.String(50), nullable=False)# 其他字段...# 定义与User表的关系 user = db.relationship('User', backref='orders')

3. 邮件发送核心实现

3.1 基础邮件发送(SMTP)

我们使用Python的 smtplibemail 库实现邮件发送:

import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.mime.application import MIMEApplication import os defsend_email(to_email, subject, body, attachment_path=None):"""发送邮件(支持附件)"""# 邮件服务器配置 smtp_server ="smtp.qq.com" smtp_port =465 sender_email ="[email protected]" password ="your_smtp_password"# 建议使用环境变量# 创建邮件对象 msg = MIMEMultipart() msg['From']= sender_email msg['To']= to_email msg['Subject']= subject # 添加正文 msg.attach(MIMEText(body,'plain'))# 添加附件(如果有)if attachment_path:withopen(attachment_path,"rb")asfile: part = MIMEApplication(file.read(), Name=os.path.basename(attachment_path)) part['Content-Disposition']=f'attachment; filename="{os.path.basename(attachment_path)}"' msg.attach(part)# 发送邮件try:with smtplib.SMTP_SSL(smtp_server, smtp_port)as server: server.login(sender_email, password) server.sendmail(sender_email, to_email, msg.as_string())returnTrueexcept Exception as e:print(f"邮件发送失败: {e}")returnFalse

3.2 多收件人邮件发送(优化版)

结合SQLAlchemy查询,实现多收件人邮件发送:

defsend_email_to_recipients(filepath, receiver_email=None):"""发送邮件给指定邮箱和用户关联邮箱"""# 获取当前用户ID(假设通过PassportService) token, user_id = PassportService.current_user_id()# 收件人集合(自动去重) recipients =set()# 1. 添加直接指定的邮箱if receiver_email: recipients.add(receiver_email)# 2. 查询用户关联邮箱 user = User.query.get(user_id)if user and user.email: recipients.add(user.email)ifnot recipients:print("无有效收件人")returnFalse# 发送邮件(每个邮箱只发一次) success =Truefor email in recipients:ifnot send_email(email,"文件处理结果","请查收附件", filepath): success =Falsereturn success 

4. 优化策略

4.1 使用集合(Set)去重

recipients =set() recipients.add("[email protected]")# 自动去重

4.2 减少SMTP连接次数

# 优化:复用SMTP连接with smtplib.SMTP_SSL(smtp_server, smtp_port)as server: server.login(sender_email, password)for email in recipients: server.sendmail(...)

4.3 异步发送(Celery + Redis)

from celery import Celery celery = Celery('tasks', broker='redis://localhost:6379/0')@celery.taskdefasync_send_email(to_email, subject, body, attachment_path=None): send_email(to_email, subject, body, attachment_path)

5. 完整代码示例

# app.pyfrom flask import Flask from flask_sqlalchemy import SQLAlchemy import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.mime.application import MIMEApplication import os app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI']='sqlite:///app.db' db = SQLAlchemy(app)# 定义User和CustomerOrder模型(略)defsend_email_with_attachment(filepath, receiver_email=None):"""发送邮件给指定邮箱和用户关联邮箱"""# 获取当前用户ID token, user_id = PassportService.current_user_id()# 收件人集合 recipients =set()if receiver_email: recipients.add(receiver_email) user = User.query.get(user_id)if user and user.email: recipients.add(user.email)ifnot recipients:returnFalse# SMTP配置 smtp_server ="smtp.qq.com" smtp_port =465 sender_email ="[email protected]" password ="your_password"# 创建邮件内容 msg = MIMEMultipart() msg['From']= sender_email msg['Subject']="文件处理结果" msg.attach(MIMEText("请查收附件",'plain'))# 添加附件withopen(filepath,"rb")asfile: part = MIMEApplication(file.read(), Name=os.path.basename(filepath)) part['Content-Disposition']=f'attachment; filename="{os.path.basename(filepath)}"' msg.attach(part)# 发送邮件try:with smtplib.SMTP_SSL(smtp_server, smtp_port)as server: server.login(sender_email, password)for email in recipients: msg['To']= email server.sendmail(sender_email, email, msg.as_string())returnTrueexcept Exception as e:print(f"发送失败: {e}")returnFalse

6. 总结

本文详细介绍了如何基于 Python + SQLAlchemy + SMTP 实现高效邮件发送系统,核心优化点包括:

  1. 多收件人管理(自动去重)。
  2. 附件发送支持(文件读取优化)。
  3. 错误处理与日志(增强稳定性)。
  4. 性能优化(减少SMTP连接次数)。

通过合理的代码设计,我们可以构建一个健壮、可扩展的邮件通知系统,适用于订单处理、文件通知等场景。

Read more

无人机地面站QGC的安装(ubuntu20.04)

无人机地面站QGC的安装(ubuntu20.04) 1.安装依赖 使用以下命令: sudo usermod -a -G dialout $USER sudo apt-get remove modemmanager -y sudo apt install gstreamer1.0-plugins-bad gstreamer1.0-libav gstreamer1.0-gl -y sudo apt install libfuse2 -y sudo apt install libxcb-xinerama0 libxkbcommon-x11-0 libxcb-cursor0 -y 2.下载安装包 可以直接去官网下载,链接地址:https://docs.qgroundcontrol.com/master/en/qgc-user-guide/

By Ne0inhk
Qwen-Image-2512 V2版 - 细节拉满,更真实的AI绘画体验 ComfyUI+WebUI 一键整合包下载

Qwen-Image-2512 V2版 - 细节拉满,更真实的AI绘画体验 ComfyUI+WebUI 一键整合包下载

Qwen-Image-2512 是 Qwen-Image 文生图基础模型的 12 月更新版本,这是一个最新的文本生成图像模型,特点是 画面更真实、细节更精致,提升了人物与自然细节的真实感,适合在创意设计、教育展示、内容生产等领域使用。 今天分享的 Qwen-Image-2512 V2版 一键包基于阿里最新开源的 Qwen-Image-2512 的FP8量化版(同时支持BF16),支持消费级显卡最低12G显存流畅运行,支持更适合小白操作的WebUI模式和专业选手的ComfyUI两种模式。 相比较上个版本,V2版因使用精度更高的FP8模型,所以在生成效果上更好,同时对硬件的要求也更高,大家根据需要选择适合自己的版本。 下载地址:点此下载   模型特点 更真实的人物表现:相比旧版本,人物的面部细节、表情和环境都更自然,不再有明显的“AI感”。   更精细的自然细节:风景、动物毛发、水流等元素渲染更逼真,层次感更强。   更准确的文字渲染:在生成带文字的图像(如海报、PPT)时,排版和字体更清晰,图文融合更好。   更强的整体性能:

By Ne0inhk
j交通违法行为检测数据集 训练无人机智能交通监控、城市安防、自动驾驶辅助等场景。深度学习YOLOV11模型如何训练交通违规检测数据集 识别检测电动车头盔佩戴 行人闯红灯 横穿马路车辆闯红灯检测数据集

j交通违法行为检测数据集 训练无人机智能交通监控、城市安防、自动驾驶辅助等场景。深度学习YOLOV11模型如何训练交通违规检测数据集 识别检测电动车头盔佩戴 行人闯红灯 横穿马路车辆闯红灯检测数据集

无人机智能交通监控、城市安防、自动驾驶辅助等场景。深度学习YOLOV11模型如何训练交通违规检测数据集 识别检测电动车头盔佩戴 行人闯红灯 横穿马路车辆闯红灯检测数据集 文章目录 * 📊 数据集总体统计 * 🏷️ 类别定义与说明 * 🔢 数据集划分情况 * ✅ YOLO 训练配置文件示例(`data.yaml`) * 💡 使用建议 * 🚦 交通违规检测数据集 + YOLOv11 训练方案 * 📊 数据集概览 * 🔍 类别含义详解 * 🗂️ 推荐目录结构 * 🛠️ YOLO 配置文件:`traffic.yaml` * 🚀 YOLOv11 完整训练代码:`train.py` * 🧪 推理示例代码:`inference.py` * 🎯 应用场景建议 * ⚠️ 注意事项与优化建议 交通违规检测数据集 Yolo算法进行车辆、行人的交通违规检测任务,txt格式 7类,分别为:[‘Crossing_Violation’, ‘Crosswalk_Violation’,

By Ne0inhk
Neo4j-Desktop2.0安装教程(更改安装路径)

Neo4j-Desktop2.0安装教程(更改安装路径)

引言        由于neo4j-desktop2.0版本是不提供安装页面(默认安装在C盘),从而让你选择安装路径的,这对于C盘内存来说是灾难性的。因此,需要手动设置安装路径。 参考文献: 1. https://zhuanlan.zhihu.com/p/1935104156433121644https://zhuanlan.zhihu.com/p/1935104156433121644 2. https://blog.ZEEKLOG.net/WMXJY/article/details/150649084 安装包下载:https://neo4j.com/deployment-center/?desktop-gdbhttps://neo4j.com/deployment-center/?desktop-gdb 1文件夹创建及环境变量设置     首先需要在C盘以外的位置先创建一个Neo4j2文件夹,再在下面创建两个文件夹:App,PROData来存放软件本体和相关数据 然后打开“高级系统设置”——“环境变量”——系统变量下方的“新建”

By Ne0inhk