0

0

如何正确提取邮件正文文本(纯文本或HTML)

花韻仙語

花韻仙語

发布时间:2026-03-01 14:22:02

|

498人浏览过

|

来源于php中文网

原创

如何正确提取邮件正文文本(纯文本或HTML)

本文详解如何使用 Python 的 email 模块安全、准确地提取 IMAP 收取邮件的正文内容,避免常见编码错误与结构误判,推荐使用现代 EmailMessage 类及 get_body() 方法。

本文详解如何使用 python 的 `email` 模块安全、准确地提取 imap 收取邮件的正文内容,避免常见编码错误与结构误判,推荐使用现代 `emailmessage` 类及 `get_body()` 方法。

在通过 IMAP 协议读取邮件时,许多开发者会遇到 email_message.get_payload() 返回嵌套的 Message 对象列表(如 [, ...]),而非可读字符串——这并非代码“出错”,而是对 MIME 邮件结构理解不足所致。原始邮件常为 multipart/alternative 或 multipart/mixed 格式,包含纯文本(text/plain)、HTML(text/html)甚至附件等多部分,直接调用 get_payload() 仅返回顶层部件列表,无法自动解析语义优先级。

✅ 正确做法是:使用 email.message_from_bytes() + EmailMessage.get_body(),配合显式 policy=default 启用现代邮件处理模型(Python 3.3+):

import imaplib
import email
from email.policy import default

def read_email_body(username: str, password: str, sender_filter: str = None) -> list:
    imap = imaplib.IMAP4_SSL("imap.mail.com", 993)
    imap.login(username, password)
    imap.select('INBOX')

    # 搜索未读邮件(支持发件人过滤)
    search_criteria = ['UNSEEN']
    if sender_filter:
        search_criteria.extend(['FROM', f'"{sender_filter}"'])
    status, response = imap.uid('SEARCH', None, *search_criteria)

    if status != 'OK':
        return []

    msg_ids = response[0].split()
    results = []

    for e_id in msg_ids:
        # ✅ 关键修正:直接用 bytes 解析,避免 UTF-8 解码失败
        _, msg_data = imap.uid('FETCH', e_id, '(RFC822)')
        raw_email = msg_data[0][1]  # type: bytes
        email_message = email.message_from_bytes(raw_email, policy=default)

        # ✅ 提取首选正文:优先 HTML,退化到纯文本
        body_part = email_message.get_body(preferencelist=('html', 'plain'))
        if body_part is not None:
            try:
                body_text = body_part.get_content()  # 自动解码 base64/quopri
            except (LookupError, ValueError):
                # 备用:手动解码(极少数边缘情况)
                payload = body_part.get_payload(decode=True)
                body_text = payload.decode(body_part.get_content_charset() or 'utf-8', errors='replace')
        else:
            body_text = "(无正文内容)"

        results.append({
            'from': email.utils.parseaddr(email_message.get('From', '')),
            'to': email_message.get('To', ''),
            'subject': email.header.decode_header(email_message.get('Subject', ''))[0][0],
            'body': body_text[:500] + '...' if len(body_text) > 500 else body_text  # 示例截断
        })

    imap.logout()
    return results

# 使用示例
emails = read_email_body("user@mail.com", "app_password", "pedro@example.com")
for mail in emails:
    print(f"【{mail['subject']}】\n{mail['body']}\n{'─' * 50}")

? 关键注意事项

SeoShop
SeoShop

SeoShop网店系统全站纯静态html生成更符合搜索引擎优化,并修改了以前许多js代码,取消了连接地址的js代码更换为纯div+css格式,并且所有文件可自定义url和文件名,自定义内部连接,自定义外部连接,等多个符合SEO搜索引擎优化的设置,让您的网店更容易让搜索引擎收录. 简单易用 极速网店真正做到以人为本、以用户体验为中心,能使您快速搭建网上购物网站。后台管理操作简单,一目了然,没有夹杂多

下载
  • 永不使用 message_from_string() 处理原始 IMAP 响应:IMAP 返回的是 bytes,可能含非 UTF-8 编码(如 GBK、ISO-8859-1),强制 .decode('utf-8') 会导致 UnicodeDecodeError。
  • get_body() 是现代标准:它按 RFC 规范自动处理 multipart/alternative 的优先级协商(如客户端偏好 HTML,则返回 text/html 部分),比手动遍历 walk() 更健壮。
  • 处理编码异常:get_content() 内部已调用 decode=True 并依据 Content-Transfer-Encoding(base64/quopri)和 charset 自动解码;若遇损坏邮件,需捕获异常并降级处理。
  • 安全提示:生产环境务必使用应用专用密码(App Password),禁用明文密码;对 HTML 正文做 XSS 过滤后再渲染。

? 总结:提取邮件正文的本质是尊重 MIME 结构。放弃“字符串拼接”思维,拥抱 EmailMessage 的语义化 API —— get_body() 是获取人类可读内容的黄金方法,配合 message_from_bytes() 和 policy=default,即可稳健应对 99% 的真实邮件场景。

立即学习前端免费学习笔记(深入)”;

相关文章

HTML速学教程(入门课程)
HTML速学教程(入门课程)

HTML怎么学习?HTML怎么入门?HTML在哪学?HTML怎么学才快?不用担心,这里为大家提供了HTML速学教程(入门课程),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

658

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

219

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1560

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

645

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

1088

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

1042

2024.04.29

go语言字符串相关教程
go语言字符串相关教程

本专题整合了go语言字符串相关教程,阅读专题下面的文章了解更多详细内容。

186

2025.07.29

c++字符串相关教程
c++字符串相关教程

本专题整合了c++字符串相关教程,阅读专题下面的文章了解更多详细内容。

90

2025.08.07

Golang 测试体系与代码质量保障:工程级可靠性建设
Golang 测试体系与代码质量保障:工程级可靠性建设

Go语言测试体系与代码质量保障聚焦于构建工程级可靠性系统。本专题深入解析Go的测试工具链(如go test)、单元测试、集成测试及端到端测试实践,结合代码覆盖率分析、静态代码扫描(如go vet)和动态分析工具,建立全链路质量监控机制。通过自动化测试框架、持续集成(CI)流水线配置及代码审查规范,实现测试用例管理、缺陷追踪与质量门禁控制,确保代码健壮性与可维护性,为高可靠性工程系统提供质量保障。

24

2026.02.28

热门下载

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

精品课程

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

共46课时 | 3.5万人学习

AngularJS教程
AngularJS教程

共24课时 | 3.9万人学习

CSS教程
CSS教程

共754课时 | 38万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号