You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用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

火山引擎 最新活动