message_id 使用 exchangelib 获取电子邮件

fetching emails using exchangelib by message_id

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

  1. message_id 字段是否用作此唯一标识符?
  2. 似乎无法使用 message_id 批量获取电子邮件。这方面的最佳做法是什么?我可以通过调用 account.fetch 使用 item_idchangekey 获取电子邮件,但是,当用户在不同的文件夹中移动电子邮件时它们会发生变化,而 message_id 不会。

回复。 1,看来你已经发现了 message_id 在移动一个项目时保持不变。我无法从 EWS 中找到关于此事实的任何硬性文档,因此请务必进行广泛的测试。

回复。 2,确实只能使用account.fetchitem_id值。但是,有几点需要注意:

  1. 当您调用 item.move() 时,item.item_iditem.changekey 属性将更新到新位置,您可以存储该位置以供将来批量操作使用。参见 https://github.com/ecederstrand/exchangelib/blob/3a1def29951d26c8a1b7021c7582c3d118181140/exchangelib/items.py#L365
  2. 您仍然可以通过 message_id 批量获取,方法是先将 message_id 转换为 item_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 过滤器就不会变得非常大。