You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用exchangelib从收件箱子文件夹通过邮件ID获取附件问题

解决exchangelib通过邮件ID定位子文件夹邮件并获取附件的问题

你遇到的核心问题是混淆了exchangelib中的Item ID(email.id)和邮件头中的Message-ID(email.message_id),导致过滤条件不匹配,无法定位到目标邮件。

正确解决方案(基于你保存的email.id)

你之前保存的email.id是exchangelib为邮件生成的内部唯一标识,应该用id字段直接查询,而不是message_id__in:

# 直接通过Item ID获取目标邮件
try:
    target_mail = sub_folder_of_inbox.get(id='你之前保存的那串长字符串ID')
    
    # 遍历并保存附件
    for attachment in target_mail.attachments:
        # 跳过内嵌附件(比如邮件里的图片)
        if not attachment.is_inline:
            with open(attachment.name, 'wb') as f:
                f.write(attachment.content)
            print(f"附件 {attachment.name} 已成功保存")
except Exception as e:
    print(f"获取邮件失败: {str(e)}")

为什么之前的代码无效?

你使用的message_id__in是用来匹配邮件头中的Message-ID(格式通常为<xxxx@domain.com>),但你保存的email.id是exchangelib的内部Item ID,两者完全不是同一个字段,因此过滤返回的QuerySet为空。

备选方案(如果想用Message-ID查询)

如果需要通过邮件头的Message-ID来定位,要在移动邮件前先保存email.message_id,而非email.id:

# 移动邮件前先保存邮件头的Message-ID
message_id = email.message_id
email.move(account.inbox / "sub_folder_of_inbox")

# 后续通过Message-ID查询邮件
try:
    target_mail = sub_folder_of_inbox.get(message_id=message_id)
    # 处理附件逻辑同上
except Exception as e:
    print(f"获取邮件失败: {str(e)}")

内容的提问来源于stack exchange,提问作者Sumit Soni

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 18:13:10