Exchangelib 扫描所有文件夹 - 效率

Exchangelib Scan All Folders - Efficiency

我正在使用 exchangelib 连接到我的交换邮箱。目前代码正在扫描所有文件夹,因为目标电子邮件可以位于我任务的任何文件夹中。

looping/scanning这里的文件夹有更有效的方法吗? (查找大于目标开始日期的电子邮件)

all_folders = account.root.glob('**/*')
for folder in all_folders:
    # Messages can only exist in 'IPF.Note' folder classes
    if folder.folder_class == 'IPF.Note':
        # For all emails that are newer than the target date
        for email in folder.filter(datetime_received__gt=ews_bfr):
            # Do something

编辑: 谢谢你的帮助,埃里克。这有效并使 运行 时间显着减少:

target_folders = (f for f in account.root.walk() if f.name in ['xxxxxx'])
folder_coll = FolderCollection(account=account, folders=target_folders)
for email in folder_coll.filter(datetime_received__gt=ews_bfr):
    # Do something

普通的 .filter() 仅在您调用它的文件夹上工作。 EWS 不支持在所有文件夹中搜索项目,但仅支持在 FindItems 服务调用中明确提及的文件夹。

在 exchangelib 中,一次过滤多个文件夹的方法是使用 FolderCollection:

from exchangelib import FolderCollection
FolderCollection(account=account, folders=[...]).filter(some_field='foo')

folders 参数可以是任何可迭代的文件夹,例如[account.inbox, account.sent]account.root.walk()(f for f in account.root.walk() if f.CONTAINER_CLASS == 'IPF.Note')

.glob().walk().children等子文件夹访问方式也支持对它们调用.filter()

account.root.glob('**/*').filter(datetime_received__gt=ews_bfr)
account.root.walk().filter(datetime_received__gt=ews_bfr)