Python 使用exchangelib筛选帐户中所有文件夹中的邮件

Python 使用exchangelib筛选帐户中所有文件夹中的邮件,python,exchangewebservices,exchangelib,Python,Exchangewebservices,Exchangelib,我正在尝试使用exchangelib从匹配\以特定主题开头的帐户检索邮件。这必须包括所有文件夹中的邮件,而不仅仅是“收件箱”文件夹中的邮件。我在这里问了几个类似的问题 这让我使用了FolderCollection。但是,我不清楚如何创建所有文件夹的列表并将其传递给“folders”参数 目前我尝试了以下方法: conf = Configuration(server=ex_srv, credentials=cred) acct = Account(primary_smtp_address=ema

我正在尝试使用exchangelib从匹配\以特定主题开头的帐户检索邮件。这必须包括所有文件夹中的邮件,而不仅仅是“收件箱”文件夹中的邮件。我在这里问了几个类似的问题

这让我使用了FolderCollection。但是,我不清楚如何创建所有文件夹的列表并将其传递给“folders”参数

目前我尝试了以下方法:

conf = Configuration(server=ex_srv, credentials=cred)
acct = Account(primary_smtp_address=email, 
                            config=conf, 
                            autodiscover=False, 
                            credentials=cred, 
                            access_type=IMPERSONATION
                        )

from exchangelib.folders import Messages, FolderCollection
all_folder_list = acct.folders[Messages]
all_folder_collection = FolderCollection(account=acct, folders=all_folder_list)

all_folder_collection.filter(subject__startswith='test')
我似乎犯了一个愚蠢的错误,但我不能抽空去抓住它

有人能告诉我实现这个用例的最佳方式吗

编辑:

我看到的错误是

Traceback (most recent call last):

  File "queryset.py", line 298, in __iter__
    for val in self._format_items(items=self._query(), return_format=self.return_format):
  File "queryset.py", line 375, in _item_yielder
    for i in iterable:
  File "account.py", line 580, in fetch
    shape=ID_ONLY,
  File "account.py", line 302, in _consume_item_service
    is_empty, items = peek(items)
  File "util.py", line 118, in peek
    first = next(iterable)
  File "folders.py", line 250, in find_items
    for i in items:
  File "services.py", line 432, in _paged_call
    parsed_pages = [self._get_page(message) for message in response]
  File "services.py", line 432, in <listcomp>
    parsed_pages = [self._get_page(message) for message in response]
  File "services.py", line 481, in _get_page
    rootfolder = self._get_element_container(message=message, name='{%s}RootFolder' % MNS)
  File "services.py", line 345, in _get_element_container
    raise self._get_exception(code=response_code, text=msg_text, msg_xml=msg_xml)
exchangelib.errors.ErrorInvalidOperation: Shared folder search cannot be performed on multiple folders.
回溯(最近一次呼叫最后一次):
文件“queryset.py”,第298行,在__
对于self.\u格式的val项(items=self.\u query(),return\u format=self.return\u格式):
文件“queryset.py”,第375行,在项目中
因为我在iterable:
文件“account.py”,第580行,在fetch中
形状=仅ID_,
文件“account.py”,第302行,在_-consumer\u-item\u服务中
为空,项目=peek(项目)
文件“util.py”,第118行,在peek中
第一个=下一个(iterable)
文件“folders.py”,第250行,在find_items中
对于项目中的i:
文件“services.py”,第432行,在paged\u call中
已解析的页面=[self.\u获取响应消息的页面(消息)]
文件“services.py”,第432行,在
已解析的页面=[self.\u获取响应消息的页面(消息)]
文件“services.py”,第481行,在_get_页
rootfolder=self.\u获取元素\u容器(message=message,name='{%s}rootfolder'%MNS)
文件“services.py”,第345行,在_get_element_容器中
自我提升。\获取\异常(代码=响应\代码,文本=消息\文本,消息\ xml=消息\ xml)
exchangelib.errors.ErrorInvalidOperation:无法对多个文件夹执行共享文件夹搜索。

问题在于您的FolderCollection包含多个共享文件夹。EWS不允许一次查询多个共享文件夹。如果不需要搜索共享文件夹,则必须将其从搜索中排除,或者一次搜索一个共享文件夹。

您看到的错误是什么?最新版本的exchangelib没有
帐户。文件夹
dict,但您可以
walk()
glob()
包含子文件夹的文件夹。请看,您甚至可以直接对其进行筛选,例如
root.walk().filter(subject\uu startswith='test')
FolderCollection
接受文件夹列表或文件夹生成器,使您的代码看起来正确。Erik,感谢您的回复。我得到的错误是“无法对多个文件夹执行共享文件夹搜索”。我找不到足够的信息来解释为什么会发生这种情况,但考虑到我正在搜索一组文件夹,我对这个错误感到困惑。我假设我没有传递正确的文件夹列表。这是我使用root.walk().filter()的时候,你能将完整的堆栈跟踪附加到原始帖子吗?谢谢Erik。我已经添加了stacktrace。谢谢Erik的帮助。我花了一些时间想办法过滤掉这个。我用account.root.walk()替换了all_folder_list=acct.folders[Messages],并将每个文件夹添加到all_folder_列表中。但我无法确定文件夹上的哪个属性表示它是共享文件夹。我看到了几个字段,如有效版权等,但我不确定使用哪个字段。或者,既然我知道我只想搜索电子邮件,而不想查看其他类型的邮件,比如便笺、联系人等,那么有没有办法从一开始就过滤掉只包含邮件的文件夹?我相信共享文件夹存储在
帐户下。public\u folders\u root
但是我对共享文件夹没有太多经验。文件夹实例具有一个
supported\u item\u models
属性,说明其支持的项目类型。见: