Python如何从FastAPI Mail测试记录/MIMEText对象提取邮件HTML正文
FastAPI Mail 测试场景下提取HTML正文及验证链接方案
直接可用的完整代码
import re from fastapi_mail import FastMail # 测试环境配置 fm = FastMail(你的邮件配置实例) fm.config.SUPPRESS_SEND = 1 with fm.record_messages() as outbox: # 此处执行触发发信的操作,例如调用注册测试接口 # test_client.post("/api/register", json={"email": "test@example.com", "password": "test123456"}) # 提取第一封拦截到的邮件 mail = outbox[0] html_content = "" # 兼容单部分/多部分邮件格式 if mail.is_multipart(): for part in mail.walk(): # 跳过附件,定位HTML正文部分 if part.get_content_type() == "text/html" and "attachment" not in part.get("Content-Disposition", ""): payload_bytes = part.get_payload(decode=True) html_content = payload_bytes.decode(part.get_content_charset() or "utf-8") break else: payload_bytes = mail.get_payload(decode=True) html_content = payload_bytes.decode(mail.get_content_charset() or "utf-8") # 提取邮箱验证链接 verify_url = re.search(r"https?://[^\s\"<>]+(?:verify|activate)[^\s\"<>]*", html_content).group() # 后续直接请求verify_url即可完成全链路注册测试
核心问题说明
- 直接调用
get_payload()不传参数时,方法默认返回编码后的原始文本(即你看到的base64字符串),不会执行解码逻辑 - 手动复制base64串可以解码成功,但代码直接取原始payload时,字符串会包含MIME标准要求的76字符折行符,直接手动base64解码会报错
get_payload(decode=True)是email模块标准API,会自动识别Content-Transfer-Encoding头,适配base64、quoted-printable等所有编码格式,直接返回解码后的字节串,不需要手动处理编码逻辑
注意事项
- 提取链接的正则需要根据你自己的业务路由调整,上面的正则只是示例,匹配包含verify/activate路径的http/https链接
- 如果正文有中文,必须从邮件头取对应字符集解码,不要硬编码utf-8,避免出现乱码
- 多部分邮件遍历的时候一定要跳过附件部分,否则可能取到错误的payload内容
内容的提问来源于stack exchange,提问作者Sheyzi Silver
相关产品推荐
相关产品推荐

