如何从Microsoft Graph获取的multipart/signed签名邮件附件中提取Excel文件
处理S/MIME签名邮件附件提取Excel的通用流程及Python工具
通用处理流程
- 1. 解码附件原始内容
从Microsoft Graph获取的附件content字段是Base64编码格式,先将其解码为二进制数据,可直接在内存中处理或保存为.p7m文件。 - 2. 提取签名容器内的原始邮件
.p7m是S/MIME签名后的容器文件,包含原始邮件(带附件)和签名信息。可选择先验证签名有效性(保障内容完整性),再提取出包裹在内的原始MIME格式邮件数据。 - 3. 解析MIME邮件结构
将提取到的原始MIME数据解析为邮件对象,遍历邮件的各个组成部分,筛选出类型为Excel的附件(常见类型:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet对应.xlsx,application/vnd.ms-excel对应.xls)。 - 4. 保存Excel附件
将目标Excel附件的内容解码(通常也是Base64格式),写入本地文件完成提取。
适用的Python包
pycryptodome:提供底层加密算法支持,可用于S/MIME签名验证与内容提取,需配合MIME解析工具使用。email:Python标准库,专门用于解析MIME格式邮件,能便捷遍历邮件各部分、筛选目标附件。smime:第三方S/MIME专用库,封装了解析、验证、内容提取的逻辑,使用更简洁高效。base64:Python标准库,用于处理Base64编码和解码,是处理附件内容的基础工具。
简单代码示例
import smime import email import base64 # 替换为从Microsoft Graph获取的附件Base64内容 p7m_base64_content = "获取到的Base64字符串" # 解码为二进制数据 p7m_binary = base64.b64decode(p7m_base64_content) # 跳过签名验证,直接提取原始MIME邮件数据 raw_mime_data = smime.verify(p7m_binary, verify_signature=False) # 解析MIME邮件 mail_msg = email.message_from_bytes(raw_mime_data) # 遍历并提取Excel附件 for part in mail_msg.walk(): if part.get_content_maintype() == 'application' and part.get_filename(): file_name = part.get_filename() if file_name.lower().endswith(('.xlsx', '.xls')): excel_binary = part.get_payload(decode=True) with open(file_name, 'wb') as excel_file: excel_file.write(excel_binary) print(f"已成功提取Excel附件:{file_name}")
内容的提问来源于stack exchange,提问作者t3chb0t
相关产品推荐
相关产品推荐

