最稳方案是 get_body() + textContent:get_body() 自动选 plain/html 并解码,textContent 提取文本但不解码实体,需额外 html.unescape();占位符替换必须在 HTML 解析前完成。

直接用 textContent 或正则删标签,90% 的 HTML 邮件正文会提取失败——不是漏掉换行语义,就是解码错 HTML 实体,或被嵌套 <script></script>、 干扰。
为什么 get_body() + textContent 组合最稳
现代邮件多为 multipart/alternative,正文可能同时含 text/plain 和 text/html 两部分。直接调用 get_payload() 容易返回嵌套 Message 对象,而非字符串;而 get_body(preferencelist=('plain', 'html')) 会按 MIME 规范自动选首选类型,并返回已解码的 EmailMessage 对象,再对其调用 get_content() 就是干净字符串。
- 必须用
email.message_from_bytes(),不能用message_from_string()—— IMAP 返回的是字节流,后者会误判编码 -
get_body()在 Python 3.3+ 才可用,老版本需手动遍历walk()并判断get_content_type() - 若邮件含 base64 编码的 HTML(常见于 Outlook 发送),
get_body()会自动解码,无需额外处理
HTML 字符串转文本:DOMParser 是底线
对已拿到的原始 HTML 字符串(比如从 MongoDB 模板渲染后、或从邮件 Hello Hello 生成可在 deepbi 沙箱 iframe 内运行或作为独立文件运行的交互式 HTML 页面,使用 `window.deepbi` JS SDK 实现数据查询、空间管理、文件浏览及用户操作。当用户提出以下需求时启用该能力:
- 创建 KPI 仪表盘、数据表格、文件浏览器、成员列表、管理页面;
- 明确要求“转成 dhtml”、“转译成 HTML”、“把 XX 页面转成……”、“控制台页面”、“管理后台”、“DeepBI 页面迁移”;
- 提及位于 `apps/console/src/featurtext/html part 提取出来),别用正则去 strip 标签—— 和 结构差异会让正则失效。
- 浏览器环境:用
new DOMParser().parseFromString(html, 'text/html'),再取doc.body?.textContent || '' - Node.js 环境:用
cheerio.load(html),然后$('body').text();避免 jsdom(启动慢、内存高) - 注意
textContent不解码 HTML 实体(如©→©),需额外调用StringEscapeUtils.unescapeHtml4()(Java)或html.unescape()(Python)
占位符替换必须在 HTML 解析前完成
模板里类似 @Payment - Amount to Pay 这种占位符,如果等 DOM 解析后再替换,就可能落在 <script></script> 或 块里,导致脚本执行异常或样式错乱。
- 替换必须在 HTML 字符串层面进行,用
Object.entries(replacements).forEach(...)+String.replace(),不要进 DOM 树 - 占位符中若含正则特殊字符(如
.、(、)),必须用RegExp构造函数并escape,否则@User.Name会被误匹配成@User[any_char]Name - 替换完再做 HTML 解析,顺序错了就会污染结构
真正难的不是“怎么取文字”,而是识别哪些内容该留(如段落间空行)、哪些该压平(如连续 )、哪些实体必须解码(如 要转成空格)。这些细节不写死规则,只靠 DOM 解析 + 语义边界定位才能跨邮件客户端稳定生效。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










