Python遍历文件夹邮件并存入字典的代码问题求助
问题分析与解决方案
两个核心问题
- 未定义
msg变量:首次代码直接调用msg.To等属性,但未创建msg对象,必然报错。必须通过outlook.OpenSharedItem()打开目标邮件文件,才能获取邮件对象。 - 数据被覆盖:修改后每次循环都重新赋值
data = pd.DataFrame(...),前一次循环的结果会被覆盖,最终仅保留最后一封邮件的数据。需先将所有邮件数据收集到列表,再统一转换为DataFrame。
修正后的完整代码
import win32com.client import pandas as pd import datetime import os # 邮件文件夹路径 folder = r'C:\Users\XX\Desktop\Emails' # 结果保存路径 result_folder = r'C:\Users\XX\Desktop\Result' # 初始化Outlook outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI") # 初始化空列表,存储所有邮件的信息字典 email_data_list = [] # 遍历文件夹中的所有文件 for filename in os.listdir(folder): # 仅处理.msg格式的邮件文件(避免处理非邮件文件) if filename.endswith('.msg'): print(f"正在处理:{filename}") # 拼接完整文件路径 full_file_path = os.path.join(folder, filename) # 打开邮件获取msg对象 msg = outlook.OpenSharedItem(full_file_path) # 整理当前邮件信息为字典 email_info = { 'Filename': filename, 'To': msg.To, 'Cc': msg.Cc, 'From': msg.SenderName, 'Subject': msg.Subject, 'Body': msg.Body, 'SentDateTime': datetime.datetime.fromtimestamp( timestamp=msg.SentOn.timestamp(), tz=msg.SentOn.tzinfo ).strftime('%Y-%m-%d %H:%M') } # 将字典添加到列表 email_data_list.append(email_info) # 将列表转换为DataFrame data = pd.DataFrame(email_data_list) # 保存结果到指定文件夹(可选) os.makedirs(result_folder, exist_ok=True) data.to_csv(os.path.join(result_folder, 'email_summary.csv'), index=False, encoding='utf-8-sig') print(f"处理完成,共获取{len(data)}封邮件数据")
关键说明
- 完整路径拼接:
os.listdir()仅返回文件名,需用os.path.join()拼接文件夹路径,确保Outlook能找到正确的邮件文件。 - 数据收集逻辑:用列表存储每个邮件的字典,避免循环中覆盖DataFrame,保证所有数据被保留。
- 文件过滤:通过
endswith('.msg')跳过非邮件文件,避免无关文件引发报错。
内容的提问来源于stack exchange,提问作者fromthedark
相关产品推荐
相关产品推荐

