在Python Flask中如何通过Flask-Mail发送带附件的验证邮件?

阿强大大_8268

阿强大大_8268

2026-07-22

523人浏览

原创

附件发送失败主因是路径错误、mime类型不当、上下文不一致及smtp配置不足;需用绝对路径校验存在性、正确设置二进制文件mime子类型、共用token变量、压缩大附件并调高超时阈值。

在python flask中如何通过flask-mail发送带附件的验证邮件?

附件路径错误导致邮件发送失败

Flask-Mail 本身不校验附件文件是否存在,send() 调用成功但收件人收不到附件,大概率是路径写错了。常见坑是:用相对路径(比如 "./files/verify.pdf")在生产环境(如 Gunicorn 启动)下找不到文件——工作目录不是你开发时的项目根目录。

  • 始终用 os.path.join(app.root_path, "static", "attachments", "verify.pdf") 构造绝对路径,app.root_path 稳定指向 Flask 应用实例所在目录
  • 发信前加一行检查:if not os.path.exists(attachment_path): raise ValueError(f"Attachment missing: {attachment_path}")
  • 别把敏感文件(如数据库备份)放附件目录,Flask 静态路由可能意外暴露它们

构造带附件的 Message 实例要注意 MIME 类型

Message 对象对附件没封装高级接口,必须手动添加 MIMEApplication 或 MIMEBase,否则附件会变成乱码或被拒收。尤其注意二进制文件(PDF、PNG)不能用 attach(filename, content, 'text/plain') 硬塞。

python-script-generator
python-script-generator

快速生成专业的 Python 脚本和应用代码。一键创建完整项目结构,支持CLI、API、爬虫、Bot、Django等多种项目类型,包含完整的项目结构、配置文件、依赖管理、测试、README和文档。

下载
  • 文本类附件(如 .txt、.csv)可用 msg.attach("info.txt", "text/plain", content.encode("utf-8"))
  • 二进制文件必须读取为 bytes 并指定 subtype:with open(path, "rb") as f: msg.attach("verify.pdf", "application/pdf", f.read())
  • 避免用 charset="utf-8" 去 attach 二进制内容——这会导致 PDF 头部被篡改,打开报错

验证邮件正文和附件需共用同一上下文变量

用户点击邮件里的验证链接时,链接参数(如 token)要和附件里嵌入的凭证一致,否则验证逻辑断裂。附件内容(如 PDF 里的 token)不能靠模板渲染生成,得和邮件正文用同一个 generate_token(user.id) 结果。

  • 生成 token 后立刻存入变量:token = generate_token(user.id),再同时用于 url_for("auth.verify", token=token, _external=True) 和附件内容填充
  • 如果附件是动态生成的 PDF,用 io.BytesIO 写入内存而非落地文件,避免并发时文件覆盖或权限问题
  • 测试时用真实邮箱(别只测 Gmail,Outlook 对附件大小限制更严,超过 10MB 直接退信)

SMTP 配置不当引发附件被拦截或超时

带附件的邮件比纯文本大得多,容易触发 SMTP 服务器的大小限制或 TLS 协商失败。Gmail 默认限制 25MB,但很多企业邮箱(如腾讯企业邮)实际阈值是 10MB,且对 application/octet-stream 类型附件更敏感。

  • 在 app.config 中显式设置:MAIL_MAX_EMAILS = 1(防并发冲撞),MAIL_TIMEOUT = 30(默认 10 秒不够传附件)
  • 附件总大小超过 5MB 时,优先压缩(如用 PIL.Image 缩小 PNG)或改用网盘链接+正文说明,别硬传
  • 本地开发用 python -m smtpd -c DebuggingServer -n localhost:1025 拦截邮件看原始 MIME 结构,确认 Content-Disposition: attachment 字段存在且 filename 未被 URL 编码污染
附件不是加个 attach() 就完事——路径、MIME、上下文、SMTP 四处任一环节松动,用户就收不到可验证的完整邮件。

Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1671

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

4144

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1669

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

23977

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

2927

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

2967

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1143

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

596

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2303

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程