首页 > 解决方案 > 通过 message_id 使用 exchangelib 获取电子邮件

问题描述

我正在使用 exchangelib 维护一个应用程序。我需要能够将电子邮件移动到不同的文件夹,这完全可以使用 exchangelib。但是,我应该让我的客户手动执行相同的操作。我想要做的是查看稍后将哪些电子邮件移动到哪个文件夹。所以我需要一个电子邮件的跟踪 ID。所以可能的问题是:

  1. 该字段是否message_id用作此唯一标识符?
  2. 似乎无法使用message_id. 对此的最佳做法是什么?我可以使用item_id和获取电子邮件changekey,但是通过调用account.fetch,它们会随着用户在不同文件夹中移动电子邮件而改变,而message_id不会。

标签: pythonexchange-serverexchangelib

解决方案


回覆。1,您似乎已经发现,message_id当一个项目被移动时,它保持不变。我无法从 EWS 中找到任何关于此事实的硬文件,因此请务必进行广泛的测试。

回覆。2、确实只能用account.fetchwithitem_id值。但是,有一些事情需要注意:

  1. 当您调用item.move()时,item.item_id属性item.changekey会更新到新位置,您可以存储该位置以供将来进行批量操作。见https://github.com/ecederstrand/exchangelib/blob/3a1def29951d26c8a1b7021c7582c3d118181140/exchangelib/items.py#L365
  2. 您仍然可以message_id通过首先将 转换message_iditem_id. 这会打一个FindItem电话,然后打一个GetItem电话:

item_ids = account.inbox.filter(message_id__in=<your_message_ids>) \
    .values_list('item_id', 'changekey')
bulk_items = account.fetch(item_ids)

您可能想要对<your_message_ids>项目进行分块,以便__in过滤器不会变得非常大。


推荐阅读