You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 13:06:32