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)
我正在使用 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)