使用Python Exchangelib读取邮件中嵌套.msg附件邮件内容的问题
解决Exchangelib读取嵌套.msg附件邮件内容的问题
我完全懂这种头疼的情况——客户用嵌套邮件传数据虽然不太规范,但咱也得想办法搞定对吧?其实Exchangelib本身就支持直接解析.msg格式的邮件附件,不用先保存到本地再处理,下面是具体的实现步骤和代码:
核心思路
Exchangelib的Attachment对象提供了一个非常实用的to_message()方法,能直接把.msg格式的附件转换成可操作的Message实例,这样你就能像处理普通邮件一样读取它的内容、提取里面的电子表格附件了。
完整代码示例
1. 基础配置与连接Exchange
首先是常规的Exchange账户连接代码:
from exchangelib import Credentials, Account, FileAttachment # 配置账户信息 credentials = Credentials(username='你的邮箱账号', password='你的密码') account = Account( primary_smtp_address='你的邮箱地址', credentials=credentials, autodiscover=True, access_type='delegate' )
2. 递归处理嵌套邮件附件
写一个递归函数,用来处理可能的多层嵌套(虽然你说客户是3-4封.msg,但万一有更深的嵌套也能处理):
def extract_excel_from_nested_emails(message): """递归遍历邮件及其嵌套附件,提取所有电子表格附件""" excel_attachments = [] # 先处理当前邮件的附件 for attachment in message.attachments: # 判断是否是.msg格式的邮件附件 if isinstance(attachment, FileAttachment) and attachment.filename.lower().endswith('.msg'): # 把附件转换成Message对象 nested_msg = attachment.to_message() print(f"发现嵌套邮件: {nested_msg.subject}") # 递归处理嵌套邮件里的附件 excel_attachments.extend(extract_excel_from_nested_emails(nested_msg)) # 判断是否是电子表格附件(可根据需要扩展格式) elif isinstance(attachment, FileAttachment) and attachment.filename.lower().endswith(('.xlsx', '.xls', '.csv')): print(f"找到电子表格附件: {attachment.filename}") # 可以直接保存到本地,或者读取内容 # 保存到本地 with open(f"./{attachment.filename}", 'wb') as f: f.write(attachment.content) # 或者直接用pandas读取(需要安装pandas和对应的库) # import pandas as pd # import io # df = pd.read_excel(io.BytesIO(attachment.content)) excel_attachments.append(attachment) return excel_attachments
3. 调用函数处理目标邮件
比如你要处理收件箱里的某封邮件:
# 获取收件箱里的最新邮件(示例,可根据需要筛选) target_email = account.inbox.all().order_by('-datetime_received')[0] print(f"处理目标邮件: {target_email.subject}") # 提取所有电子表格附件 extracted_excels = extract_excel_from_nested_emails(target_email) print(f"共提取到 {len(extracted_excels)} 个电子表格附件")
关键注意点
- 确保你的Exchangelib版本是较新的,
to_message()方法是在较新版本中加入的,如果版本太旧可能需要升级:pip install --upgrade exchangelib - 处理大附件时要注意内存占用,如果附件特别大,建议先保存到本地再处理,而不是直接在内存中读取
- 可以根据实际需求调整电子表格的格式筛选(比如加上
.ods等)
如果还有特殊情况,比如某些.msg附件解析有问题,可以再针对性调整处理逻辑~
内容的提问来源于stack exchange,提问作者Hugo Vares




