使用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
相关产品推荐
相关产品推荐

