使用exchangelib实现两个邮箱账户收件箱邮件同步的相关问题
exchangelib双邮箱收件箱同步实现方案
该需求可正常实现,无需调用send_and_save()方法,核心逻辑是清除源邮件的源账户专属标识后,绑定到目标账户直接保存即可,具体实现思路如下:
- 首先处理
sync_items()返回的三类变更类型:create(新增邮件)、update(更新已有邮件)、delete(删除邮件),不同类型对应不同同步逻辑。 - 新增邮件处理:源邮件的
id和changekey是源账户专属的唯一标识,必须先清空这两个属性,再将邮件所属账户修改为目标账户,所属文件夹绑定到目标账户收件箱,直接调用save()方法即可完成保存,不会触发邮件发送行为。 - 更新/删除邮件处理:邮件的
message_id是全局唯一标识,不受账户限制,可通过该字段在目标账户收件箱中匹配到对应邮件,再执行内容覆盖更新或删除操作。
参考实现代码
source_items = source_account.inbox.sync_items() for change_type, item in source_items: if change_type == 'create': # 清除源账户专属标识 item.id = None item.changekey = None # 绑定目标账户和收件箱 item.account = target_account item.folder = target_account.inbox # 直接保存即可完成同步 item.save() elif change_type == 'update': # 通过全局唯一的message_id匹配目标邮件 target_item = target_account.inbox.get(message_id=item.message_id) # 覆盖需要同步的字段 target_item.subject = item.subject target_item.body = item.body target_item.is_read = item.is_read target_item.attachments = item.attachments target_item.save() elif change_type == 'delete': # 匹配后执行删除操作 target_item = target_account.inbox.get(message_id=item.message_id) target_item.delete()
注意事项:
- 如需增量同步,可以给
sync_items()方法传入sync_state参数记录同步状态,避免每次全量拉取源邮箱内容,提升同步效率。- 如需完全还原邮件状态,可以额外同步
datetime_received(收件时间)、categories(分类标签)等属性。- 附件默认会随item对象同步,不需要额外单独处理。
内容的提问来源于stack exchange,提问作者Suzabi
相关产品推荐
相关产品推荐

