高效邮件发送系统设计与实现:基于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

《数据结构》宗师级大记忆恢复术 —— 链表

《数据结构》宗师级大记忆恢复术 —— 链表

目录 一. 单链表的定义 二. 单链表的基本操作 1. 单链表的初始化 2. 单链表判空 3. 求表长的操作 4. 按序号查找结点 5. 按值查找表结点 6. 插入结点操作(指定位置) 7. 插入结点操作(指定结点) 8. 删除结点操作 9. 采用头插法建立单链表 10. 采用尾插法建立单链表 三. 双链表的定义 四. 双链表的基本操作 1. 双链表的初始化 2. 双链表的插入 3. 双链表的删除 4. 双链表的销毁 五. 循环链表的定义 1. 循环单链表 2. 循环双链表 六. 静态链表的定义 七. 顺序表和链表的区别 1.

By Ne0inhk
前缀和算法专题(2)

前缀和算法专题(2)

找往期文章包括但不限于本期文章中不懂的知识点: 个人主页:我要学编程(ಥ_ಥ)-ZEEKLOG博客 所属专栏: 优选算法专题 对于 "前缀和" 不是很了解的小伙伴一定要去看下面这篇博客:前缀和算法的介绍 目录 560. 和为K 的子数组 974. 和可被K整除的子数组 525. 连续数组 1314. 矩阵区域和 560. 和为K 的子数组 题目: 给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的子数组的个数 。 子数组是数组中元素的连续非空序列。 示例 1:输入:nums = [1,1,1], k = 2 输出:2 示例 2:

By Ne0inhk
Flutter 三方库 sm_crypto 的鸿蒙化适配指南 - 实现国产密码算法 SM2/SM3/SM4 的端侧加解密、支持数字签名与国密 SSL 安全通信实战

Flutter 三方库 sm_crypto 的鸿蒙化适配指南 - 实现国产密码算法 SM2/SM3/SM4 的端侧加解密、支持数字签名与国密 SSL 安全通信实战

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 sm_crypto 的鸿蒙化适配指南 - 实现国产密码算法 SM2/SM3/SM4 的端侧加解密、支持数字签名与国密 SSL 安全通信实战 前言 在进行针对中国市场的 Flutter for OpenHarmony 企业级或政务级应用开发时,支持国产密码算法(国密)是硬性的合规要求。sm_crypto 是一个功能完备的国密算法 Dart 实现库。它涵盖了非对称加密 SM2、哈希摘要 SM3 以及对称加密 SM4。本文将探讨如何在鸿蒙端利用该库构建符合国家标准的安全加密体系。 一、原原理性解析 / 概念介绍 1.1 基础原理 sm_crypto 严格遵循国家密码管理局发布的 GM/

By Ne0inhk
Flutter 三方库 crypto 的鸿蒙化适配指南 - 实现具备工业级哈希算法与消息摘要计算的安全底座、支持端侧数据校验与数字签名实战

Flutter 三方库 crypto 的鸿蒙化适配指南 - 实现具备工业级哈希算法与消息摘要计算的安全底座、支持端侧数据校验与数字签名实战

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 crypto 的鸿蒙化适配指南 - 实现具备工业级哈希算法与消息摘要计算的安全底座、支持端侧数据校验与数字签名实战 前言 在进行 Flutter for OpenHarmony 开发时,确保数据的一致性与安全性是业务上线的先决条件。无论是对用户密码进行加盐哈希存储、验证下载文件的完整性,还是为分布式信令生成 API 签名,都离不开严谨的加密算法支持。crypto 是 Dart 官方生态中用于处理哈希与摘要的核心工具库。本文将探讨如何在鸿蒙端构建极致、稳健的加密算法基石。 一、原直观解析 / 概念介绍 1.1 基础原理 该库提供了一系列纯 Dart 实现的一致性哈希算法(Hash Algorithims)。它通过将任意长度的输入映射为固定长度的二进制摘要(Digest)。支持流式处理(Chunked processing),即允许在读取大文件时分批次泵送数据。在鸿蒙端。它是“

By Ne0inhk