跳到主要内容
极客日志极客日志
首页博客AI提示词GitHub精选代理工具
搜索
|注册
博客列表
PythonAI

Python 批量解析 EML 邮件文件存成 txt 利用 AI 辅助生成年终总结

Python 脚本批量解析 EML 邮件文件,提取发件人、收件人、主题及正文等核心信息,解决中文路径和编码乱码问题。生成的结构化文本报告可直接作为 AI 提示词,辅助快速撰写高质量年终总结,提升职场办公效率。支持 Windows 中文路径处理及多种邮件编码格式兼容,适用于项目复盘、工作汇报等场景。

laoliangsh发布于 2026/3/15更新于 2026/4/2511 浏览

批量解析 EML 邮件文件,AI 辅助快速生成年终总结

在年底撰写工作总结时,邮件记录是最真实的工作轨迹凭证。手动整理数十上百封邮件不仅耗时,还容易遗漏关键信息。本文将分享一个 Python 脚本,可批量解析 EML 格式邮件,自动汇总发件人、收件人、主题、正文等核心信息,生成结构化的文本报告,直接投喂 AI 即可快速生成高质量年终总结。

教程核心价值

  1. 解放双手:批量处理任意数量 EML 文件,无需手动打开每封邮件
  2. 结构化汇总:自动提取邮件关键信息,按统一格式整理
  3. AI 友好:生成的纯文本报告可直接作为 AI 提示词,快速生成年终总结
  4. 编码兼容:完美解决中文邮件、中文路径乱码问题

环境准备

1. 安装 Python

确保本地安装 Python 3.7 及以上版本(推荐 3.9+),可从 Python 官网下载安装。

2. 安装依赖库

打开命令提示符(CMD)或终端,执行以下命令安装所需依赖:

pip install html2text pywin32 
  • html2text:将邮件中的 HTML 格式正文转为纯文本
  • pywin32:解决 Windows 系统中文路径访问问题

完整代码实现

将以下代码保存为 eml_summary.py 文件:

import email
import quopri
import base64
import html2text
from email.header import decode_header
import os
import glob
from datetime import datetime
import sys

# 解决中文路径问题
if sys.platform == 'win32':
    import win32api
    import win32con

def decode_email_header(header_value):
    """解码邮件头(处理中文等非 ASCII 字符)"""
    if not header_value:
        return ""
    decoded_parts = decode_header(header_value)
    header_parts = []
     part, encoding  decoded_parts:
         (part, ):
             encoding:
                header_parts.append(part.decode(encoding, errors=))
            :
                
                :
                    header_parts.append(part.decode())
                :
                    :
                        header_parts.append(part.decode())
                    :
                        header_parts.append(part.decode())
        :
            header_parts.append(part)
     .join(header_parts)

 ():
    
    :
        
        decoded_bytes = base64.b64decode(content)
        
         decoded_bytes.decode(charset, errors=)
     Exception  e:
        :
             decoded_bytes.decode(, errors=)
        :
             decoded_bytes.decode(, errors=)

 ():
    
    
    payload = part.get_payload(decode=)
    charset = part.get_content_charset()  
    
    transfer_encoding = part.get(, ).lower()
     transfer_encoding == :
        
        text = decode_base64_content(payload, charset)
     transfer_encoding == :
        
        decoded_bytes = quopri.decodestring(payload)
        :
            text = decoded_bytes.decode(charset, errors=)
        :
            text = decoded_bytes.decode(, errors=)
    :
        
        :
            text = payload.decode(charset, errors=)
        :
            :
                text = payload.decode(, errors=)
            :
                text = payload.decode(, errors=)
     text

 ():
    
    :
        
         sys.platform == :
            eml_file_path = win32api.GetShortPathName(eml_file_path)
        
         (eml_file_path, )  f:
            msg = email.message_from_bytes(f.read())
        
        email_info = {
            : os.path.basename(eml_file_path),
            : decode_email_header(msg.get(, )),
            : decode_email_header(msg.get(, )),
            : decode_email_header(msg.get(, )),
            : decode_email_header(msg.get(, )),
            : decode_email_header(msg.get(, )),
            : ,
            : 
        }
        
        body_text = 
        body_html = 
        
         msg.is_multipart():
             part  msg.walk():
                content_type = part.get_content_type()
                content_disposition = (part.get())
                
                   content_disposition:
                    
                
                 content_type == :
                    body_text = decode_email_body(part)
                
                 content_type == :
                    body_html = decode_email_body(part)
        :
            
            content_type = msg.get_content_type()
             content_type == :
                body_text = decode_email_body(msg)
             content_type == :
                body_html = decode_email_body(msg)
        
         body_text:
            email_info[] = body_text
         body_html:
            
            h2t = html2text.HTML2Text()
            h2t.ignore_links = 
            h2t.ignore_images = 
            h2t.unicode_snob = 
            h2t.body_width = 
            email_info[] = h2t.handle(body_html)
     Exception  e:
        
        error_msg = 
        email_info = {
            : os.path.basename(eml_file_path),
            : error_msg,
            : ,
            : ,
            : ,
            : ,
            : ,
            : 
        }
        ()
     email_info

 ():
    
    
    output_dir = os.path.dirname(output_file_path)
     output_dir   os.path.exists(output_dir):
        os.makedirs(output_dir)
     (output_file_path, , encoding=, errors=)  f:
        
        f.write( *  + )
        f.write()
        f.write()
        f.write()
        f.write()
        f.write()
        f.write( *  + )
        
         idx, email_info  (email_info_list, ):
            f.write()
            f.write( *  + )
            
             key, value  email_info.items():
                 value:
                    
                     key == :
                        f.write()
                    :
                        f.write()
            
            f.write( +  *  + )

 ():
    
    output_txt = 
    
    current_dir = os.getcwd()
    eml_files = []
     file  os.listdir(current_dir):
         file.lower().endswith():
            eml_files.append(os.path.join(current_dir, file))
    
      eml_files:
        ()
        
    ()
    ( * )
    
    email_info_list = []
     eml_file  eml_files:
        ()
        email_content = extract_email_content(eml_file)
        email_info_list.append(email_content)
        
        status =   email_content[] ==   
        ()
    
    ()
    save_summary_to_txt(email_info_list, output_txt)
    
    ( * )
    ()
    ()
    ()
    ()
    success_count = ([x  x  email_info_list  x[] == ])
    fail_count = ([x  x  email_info_list  x[] != ])
    ()
    ()
    
    failed_files = [x[]  x  email_info_list  x[] != ]
     failed_files:
        ()
         file  failed_files[:]:  
            ()
         (failed_files) > :
            ()

 __name__ == :
    
     sys.platform == :
        os.system()
    
    
    
    main()
for
in
if
isinstance
bytes
if
'replace'
else
# 尝试常见编码
try
'utf-8'
except
try
'gbk'
except
'latin-1'
else
return
''
def
decode_base64_content
content, charset='utf-8'
"""专门解码 base64 编码的邮件正文"""
try
# 先解码 base64
# 再解码字符集
return
'replace'
except
as
try
return
'gbk'
'replace'
except
return
'latin-1'
'replace'
def
decode_email_body
part
"""解码邮件正文内容(增强版)"""
# 获取原始 payload
False
or
'utf-8'
# 处理不同的传输编码
'Content-Transfer-Encoding'
''
if
'base64'
# 专门处理 base64 编码
elif
'quoted-printable'
# 处理 quoted-printable 编码
try
'replace'
except
'gbk'
'replace'
else
# 普通编码
try
'replace'
except
try
'gbk'
'replace'
except
'latin-1'
'replace'
return
def
extract_email_content
eml_file_path
"""解析单个 EML 文件(修复中文路径和编码问题)"""
try
# 处理 Windows 中文路径问题
if
'win32'
# 读取 EML 文件(使用 rb 模式避免编码问题)
with
open
'rb'
as
# 提取邮件基本信息
'文件名'
'发件人'
'From'
''
'收件人'
'To'
''
'抄送'
'Cc'
''
'主题'
'Subject'
''
'邮件日期'
'Date'
''
'正文'
''
'解析状态'
'成功'
# 提取正文内容
""
""
# 遍历邮件部分
if
for
in
str
"Content-Disposition"
# 跳过附件
if
"attachment"
in
continue
# 提取纯文本内容
if
"text/plain"
# 提取 HTML 内容(后续转为文本)
elif
"text/html"
else
# 非多部分邮件
if
"text/plain"
elif
"text/html"
# 优先使用纯文本,若无则将 HTML 转为文本
if
'正文'
elif
# 将 HTML 转为纯文本(优化配置)
False
True
True
0
'正文'
except
as
# 详细记录错误信息
f'失败:{str(e)}'
'文件名'
'解析状态'
'发件人'
''
'收件人'
''
'抄送'
''
'主题'
''
'邮件日期'
''
'正文'
''
print
f"解析 {os.path.basename(eml_file_path)} 出错:{error_msg}"
return
def
save_summary_to_txt
email_info_list, output_file_path
"""将所有解析后的邮件内容汇总保存为 TXT 文件"""
# 确保输出目录存在
if
and
not
with
open
'w'
'utf-8'
'replace'
as
# 写入汇总标题
"="
80
"\n"
f"EML 文件批量解析汇总报告\n"
f"汇总时间:{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n"
f"解析文件总数:{len(email_info_list)}\n"
f"成功解析数:{len([x for x in email_info_list if x['解析状态']=='成功'])}\n"
f"失败解析数:{len([x for x in email_info_list if x['解析状态']!='成功'])}\n"
"="
80
"\n\n"
# 遍历每个邮件的解析结果
for
in
enumerate
1
f"【第{idx}个文件】\n"
"-"
60
"\n"
# 写入该邮件的所有信息
for
in
if
# 只写入非空内容
if
'正文'
f"{key}:\n{value}\n\n"
else
f"{key}:{value}\n"
# 每个文件之间的分隔符
"\n"
"="
80
"\n\n"
def
main
# 配置输出文件路径
"EML 文件汇总解析结果.txt"
# 获取当前文件夹下所有.eml 文件(处理中文路径)
for
in
if
'.eml'
# 检查是否找到 EML 文件
if
not
print
"错误:当前文件夹下未找到任何.eml 文件"
return
print
f"找到 {len(eml_files)} 个.eml 文件,开始批量解析..."
print
"-"
50
# 批量解析每个 EML 文件
for
in
print
f"正在解析:{os.path.basename(eml_file)}"
# 打印解析状态
"✅ 成功"
if
'解析状态'
'成功'
else
"❌ 失败"
print
f"状态:{status}"
# 保存汇总结果
print
"\n正在保存汇总结果..."
# 输出汇总信息
print
"-"
50
print
f"批量解析完成!"
print
f"汇总结果已保存至:{os.path.abspath(output_txt)}"
print
f"📊 汇总统计:"
print
f" 总文件数:{len(eml_files)}"
len
for
in
if
'解析状态'
'成功'
len
for
in
if
'解析状态'
'成功'
print
f" 成功解析:{success_count}"
print
f" 失败解析:{fail_count}"
# 输出失败的文件列表(如果有)
'文件名'
for
in
if
'解析状态'
'成功'
if
print
f"\n❌ 解析失败的文件:"
for
in
10
# 只显示前 10 个
print
f" - {file}"
if
len
10
print
f" - ... 还有 {len(failed_files)-10} 个文件解析失败"
if
"__main__"
# 设置系统编码
if
'win32'
'chcp 65001 > nul'
# 设置控制台编码为 UTF-8
# 安装依赖(首次运行时取消注释执行)
# os.system("pip install html2text pywin32")

使用步骤

1. 整理 EML 文件

将需要解析的所有 EML 格式邮件文件,复制到 eml_summary.py 脚本所在的文件夹中。

2. 运行脚本
  • Windows 系统:双击 eml_summary.py 文件,或在脚本所在文件夹按住 Shift+右键,选择'在此处打开命令窗口',执行 python eml_summary.py
  • Mac/Linux 系统:打开终端,切换到脚本所在目录,执行 python3 eml_summary.py
3. 查看解析结果

脚本运行完成后,会在同一目录生成 EML 文件汇总解析结果.txt 文件,包含:

  • 汇总统计(总文件数、成功/失败数)
  • 每封邮件的完整信息(文件名、发件人、收件人、主题、日期、正文)
  • 错误提示(解析失败的文件及原因)

核心功能解析

1. 编码处理
  • decode_email_header:解码邮件头中的中文内容,自动适配 UTF-8、GBK 等编码
  • decode_email_body:处理 Base64、Quoted-Printable 等编码格式的邮件正文
  • 解决 Windows 中文路径访问问题,避免文件读取失败
2. 内容提取
  • 自动区分纯文本/HTML 格式正文,HTML 正文自动转为纯文本
  • 跳过邮件附件,只提取核心文本内容
  • 完整提取发件人、收件人、抄送、主题、日期等关键信息
3. 结果汇总
  • 生成结构化的 TXT 报告,便于阅读和 AI 处理
  • 详细的解析状态统计,方便排查问题

AI 生成年终总结技巧

将生成的 EML 文件汇总解析结果.txt 内容复制,作为提示词投喂给 AI(如 ChatGPT、文心一言、讯飞星火等),示例提示词:

请基于以下邮件记录,帮我生成一份 2024 年度工作总结,要求:
1. 总结工作成果和完成的项目
2. 分析工作中的亮点和不足
3. 提出 2025 年的工作计划和改进方向
4. 语言正式、逻辑清晰,分点阐述,字数约 1500 字
【邮件记录开始】
[粘贴 TXT 文件中的所有内容]
【邮件记录结束】
AI 提示词优化建议:
  1. 指定角色:'以 XX 岗位的身份'、'站在团队负责人的角度'
  2. 明确结构:'分为工作成果、问题反思、未来规划三部分'
  3. 突出重点:'重点体现项目推进、客户沟通、跨部门协作的工作内容'
  4. 调整风格:'语言简洁干练'、'突出数据和成果'

常见问题解决

1. 脚本运行提示缺少模块

执行 pip install 缺失的模块名,如 pip install html2text

2. 中文乱码
  • 确保脚本文件编码为 UTF-8
  • Windows 系统已自动设置控制台编码为 UTF-8(脚本内置处理)
  • 生成的 TXT 文件用 Notepad++ 等编辑器打开,选择 UTF-8 编码
3. 部分邮件解析失败
  • 检查 EML 文件是否损坏
  • 特殊格式的邮件(如加密、特殊编码)可能解析失败,可手动打开查看
  • 查看控制台的错误提示,针对性处理

扩展优化建议

  1. 按时间筛选:增加邮件日期筛选功能,只解析指定时间段的邮件
  2. 关键词提取:集成 jieba 分词,自动提取邮件中的核心关键词
  3. Excel 导出:将结果导出为 Excel 格式,便于数据筛选和分析
  4. 分类汇总:按发件人/主题/项目自动分类邮件内容
  5. 批量导出附件:增加附件提取功能,汇总邮件中的附件文件

总结

本教程提供的 EML 邮件批量解析脚本,能快速将分散的邮件记录转化为结构化的文本报告,结合 AI 工具可大幅提升年终总结的撰写效率。不仅适用于年终总结,还可用于项目复盘、工作汇报、客户沟通记录整理等场景,是职场高效办公的实用工具。

通过简单的脚本调整,还能适配更多个性化需求,建议根据自己的工作场景优化使用,让数据整理和总结撰写更高效!

目录

  1. 批量解析 EML 邮件文件,AI 辅助快速生成年终总结
  2. 教程核心价值
  3. 环境准备
  4. 1. 安装 Python
  5. 2. 安装依赖库
  6. 完整代码实现
  7. 解决中文路径问题
  8. 使用步骤
  9. 1. 整理 EML 文件
  10. 2. 运行脚本
  11. 3. 查看解析结果
  12. 核心功能解析
  13. 1. 编码处理
  14. 2. 内容提取
  15. 3. 结果汇总
  16. AI 生成年终总结技巧
  17. AI 提示词优化建议:
  18. 常见问题解决
  19. 1. 脚本运行提示缺少模块
  20. 2. 中文乱码
  21. 3. 部分邮件解析失败
  22. 扩展优化建议
  23. 总结
  • 💰 8折买阿里云服务器限时8折了解详情
  • 💰 8折买阿里云服务器限时8折购买
  • 🦞 5分钟部署阿里云小龙虾了解详情
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • MCPHost:命令行下通过 MCP 协议与大模型及外部工具交互的工具
  • 前端开发者 Agent 工程化开发学习路线
  • OpenClaw 快速上手:从 0 到 1 技术指南
  • 使用 Metasploit 制作 Linux 可执行文件及恶意 deb 包获取 Shell
  • 前端部署最佳实践:从开发到生产
  • Flutter for OpenHarmony 实战:flex_color_scheme 构建鸿蒙美学 UI
  • Java ArrayList 动态数组核心原理与使用指南
  • C++ 类和对象:构造与析构函数的默认行为与自定义实现
  • Go 语言开发 AI 智能体实战:字节开源 Eino 框架详解与教程
  • Android MVVM 架构搭建(1):DataBinding 入门指南
  • MCP Server 实现 Excel 表格一键生成可视化图表 HTML 报告
  • AI 图像生成技术指南:从原理到实战
  • 链表相加:LeetCode 两数相加算法详解
  • Linux 下开启 MySQL 慢查询日志与分析实战
  • Android 开发工程师面试核心知识点与准备指南
  • Python 内置函数常用示例与用法详解
  • Python 正则表达式基础、常用函数及 Pandas 应用示例
  • Linux 线程与进程深度剖析:虚实内存转换、实现机制与优缺点
  • RAG 评估指南:解析评估指标与代码示例
  • Linux 进程间通信详解:管道、共享内存与内核机制

相关免费在线工具

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online