一、背景介绍:告别邮件混乱,提升办公效率
在日常工作中,邮箱是信息交流的重要工具。然而,随着邮件数量的增加,尤其是来自不同发件人的邮件混杂在收件箱中,手动分类不仅耗时,还容易遗漏关键信息。对于企业用户或个人用户来说,一个自动化的邮件分类工具可以显著提升工作效率,减少人为错误。
本文将介绍一个基于Python的邮件发件人分类器,该工具通过解析本地 .eml 邮件文件中的发件人信息,自动创建以发件人命名的文件夹,并将邮件归类保存。该工具无需依赖云端服务,完全在本地运行,适合初学者学习与使用,也具备良好的可扩展性。
二、思路分析:从解析到分类
本项目的核心目标是根据邮件的发件人信息自动分类邮件,主要分为以下几个步骤:
- 读取邮件文件列表:从用户指定的
.txt文件中读取.eml邮件文件路径; - 解析邮件内容:使用 Python 的
email模块读取.eml文件,提取发件人信息; - 提取发件人邮箱:从发件人字段中提取邮箱地址,作为分类依据;
- 创建分类文件夹:根据邮箱地址创建对应的文件夹,用于存储邮件;
- 归类并保存邮件:将解析后的邮件文件复制到对应文件夹中;
- 错误处理与异常捕获:确保程序在遇到格式错误或未知发件人时仍能正常运行。
三、代码实现:完整示例与注释
# 文件名:email_sender_classifier.py
# 语言:Python 3.8+
# 技术点:邮件解析、文件读写、目录操作、数据处理
import os
import email
from email import policy
from email.parser import BytesParser
import shutil
# 1. 解析单个邮件文件,提取发件人信息
def parse_email(file_path):
with open(file_path, 'rb') as f:
msg = BytesParser(policy=policy.default).parse(f)
from_header = msg['From']
return from_header
# 2. 从发件人信息中提取邮箱地址
def extract_email_address(from_header):
# 使用简单字符串处理提取邮箱,实际可用正则表达式增强
if '<' in from_header and '>' in from_header:
email_start = from_header.index('<') + 1
email_end = from_header.index('>')
return from_header[email_start:email_end].strip()
else:
return from_header.strip()
# 3. 创建分类文件夹(以发件人邮箱命名)
def create_category_folder(base_dir, email_address):
# 替换@为_at_以避免路径问题
folder_name = email_address.replace('@', '_at_')
folder_path = os.path.join(base_dir, folder_name)
if not os.path.exists(folder_path):
os.makedirs(folder_path)
return folder_path
# 4. 对多个邮件文件进行分类处理
def classify_emails(email_files, output_dir):
if not os.path.exists(output_dir):
os.makedirs(output_dir)
for file in email_files:
try:
from_header = parse_email(file)
email_address = extract_email_address(from_header)
dest_folder = create_category_folder(output_dir, email_address)
shutil.copy(file, dest_folder)
print(f"[INFO] 邮件已归类到: {dest_folder}")
except Exception as e:
print(f"[ERROR] 处理邮件失败: {file}, 错误: {str(e)}")
# 未知发件人归类到 others 文件夹
others_folder = os.path.join(output_dir, 'others')
if not os.path.exists(others_folder):
os.makedirs(others_folder)
shutil.copy(file, others_folder)
print(f"[INFO] 邮件已归类到: {others_folder}")
# 5. 读取邮件文件列表(每行一个 .eml 文件路径)
def read_email_files(file_path):
with open(file_path, 'r', encoding='utf-8') as f:
files = [line.strip() for line in f.readlines()]
return files
# 6. 主函数,控制流程
def main():
email_files_path = input("请输入邮件文件列表路径(如 emails_list.txt): ")
output_dir = "./classified_emails"
if not os.path.exists(email_files_path):
print("❌ 文件不存在,请检查路径。")
return
email_files = read_email_files(email_files_path)
classify_emails(email_files, output_dir)
print("✅ 邮件分类完成,结果已保存至: ./classified_emails")
if __name__ == "__main__":
main()
四、运行说明与使用示例
依赖库说明:
- Python 版本:3.8 及以上;
- 依赖库:仅使用 Python 标准库(
email,os,shutil); - 输入格式:一个文本文件(如
emails_list.txt),每行一个.eml邮件文件路径; - 输出格式:在
./classified_emails/目录下按发件人邮箱分类存储邮件。
运行方式:
- 将代码保存为
email_sender_classifier.py; - 准备一个
emails_list.txt文件,内容如下:
./emails/email1.eml
./emails/email2.eml
./emails/email3.eml
- 在终端运行:
python email_sender_classifier.py
- 按照提示输入
emails_list.txt路径,程序将自动分类邮件。
示例输出:
请输入邮件文件列表路径(如 emails_list.txt): ./emails_list.txt
[INFO] 邮件已归类到: ./classified_emails/zhangsan_at_example.com/
[INFO] 邮件已归类到: ./classified_emails/lily_at_example.com/
[INFO] 邮件已归类到: ./classified_emails/others/
✅ 邮件分类完成,结果已保存至: ./classified_emails
五、学习价值与扩展建议
学习价值:
- 邮件解析:学习如何使用 Python 标准库解析
.eml邮件文件; - 文件与目录操作:掌握
os和shutil模块的使用; - 数据处理:理解如何从文本中提取关键信息;
- 异常处理:增强代码健壮性,处理未知格式邮件;
- 本地脚本开发:适合初学者理解自动化脚本的开发流程。
扩展建议:
- 支持 IMAP 邮箱连接:使用
imaplib从邮箱服务器下载邮件; - 支持更多邮件格式:如
.msg(Outlook 邮件)或.mbox; - 添加邮件预览功能:显示邮件标题、发件人、时间等;
- 结合 NLP 技术:实现基于内容的多维度分类;
- 构建图形界面:使用
tkinter或PyQt提供更友好的交互方式; - 定时任务:使用
schedule或cron实现自动分类新邮件。
六、总结
本文实现了一个基于Python的邮件发件人分类器,通过解析本地 .eml 邮件文件,自动创建以发件人命名的文件夹,并将邮件归类保存。该工具不仅提升了邮件管理的效率,还展示了邮件解析、文件操作、数据处理等关键技术点。
通过该项目,开发者可以掌握自动化邮件分类工具的开发方法,并为构建更复杂的邮件管理系统或自动化办公工具打下坚实基础。该项目适合中级以下开发者在1~3天内完成,具有良好的学习价值和实用性。
本文由AI大模型(电信天翼量子AI云电脑-云智助手-Qwen3-32B)结合行业知识与创新视角深度思考后创作。