exchangelib icon indicating copy to clipboard operation
exchangelib copied to clipboard

Cannot fetch calendar folder

Open quzhi1 opened this issue 9 months ago • 1 comments

Describe the bug

I think the fix to https://github.com/ecederstrand/exchangelib/issues/1301 may introduce another problem. I can no longer retrieve the calendar folder.

To Reproduce

https://github.com/quzhi1/EwsPlayground/blob/main/debugging_find_calendar_folder.py

Expected behavior

The script should run without any error.

Log output

Traceback (most recent call last):
  File "/Users/[email protected]/EwsPlayground/debugging_find_calendar_folder.py", line 19, in <module>
    ).resolve()
      ^^^^^^^^^
  File "/opt/homebrew/lib/python3.12/site-packages/exchangelib/folders/queryset.py", line 187, in resolve
    return list(self.folder_collection.resolve())[0]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/homebrew/lib/python3.12/site-packages/exchangelib/folders/collections.py", line 335, in resolve
    yield from self.__class__(account=self.account, folders=resolveable_folders).get_folders(
  File "/opt/homebrew/lib/python3.12/site-packages/exchangelib/folders/collections.py", line 403, in get_folders
    yield from GetFolder(account=self.account).call(
  File "/opt/homebrew/lib/python3.12/site-packages/exchangelib/services/get_folder.py", line 51, in _elems_to_objs
    for folder, elem in zip(self.folders, elems):
  File "/opt/homebrew/lib/python3.12/site-packages/exchangelib/services/common.py", line 278, in _chunked_get_elements
    yield from self._get_elements(payload=payload_func(chunk, **kwargs))
                                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/homebrew/lib/python3.12/site-packages/exchangelib/services/get_folder.py", line 64, in get_payload
    payload.append(folder_ids_element(folders=folders, version=self.account.version))
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/homebrew/lib/python3.12/site-packages/exchangelib/services/common.py", line 961, in folder_ids_element
    return _ids_element(folders, FolderId, version, tag)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/homebrew/lib/python3.12/site-packages/exchangelib/services/common.py", line 956, in _ids_element
    set_xml_value(item_ids, to_item_id(item, item_cls), version=version)
  File "/opt/homebrew/lib/python3.12/site-packages/exchangelib/util.py", line 253, in set_xml_value
    elem.append(value.to_xml(version=version))
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/homebrew/lib/python3.12/site-packages/exchangelib/properties.py", line 321, in to_xml
    self.clean(version=version)
  File "/opt/homebrew/lib/python3.12/site-packages/exchangelib/properties.py", line 766, in clean
    raise ValueError(f"DistinguishedFolderId {self.id} must have a mailbox")
ValueError: DistinguishedFolderId calendar must have a mailbox

Additional context My requirements.txt: https://github.com/quzhi1/EwsPlayground/blob/main/requirements.txt

quzhi1 avatar May 14 '24 01:05 quzhi1

Your script is missing the mailbox argument to DistinguishedFolderId. Additionally, SingleFolderQuerySet requires a full Folder object:

folder = SingleFolderQuerySet(
    account=account,
    folder=Folder(
        root=account.root,
        _distinguished_id=DistinguishedFolderId(
            id='calendar',
            mailbox=Mailbox(email_address=account.primary_smtp_address),
        )
    ),
).resolve()
print("folder name:", folder.name)

ecederstrand avatar May 14 '24 05:05 ecederstrand

I added mailbox argument here https://github.com/quzhi1/EwsPlayground/blob/main/debugging_find_calendar_folder.py#L19

And this is the new error:

Traceback (most recent call last):
  File "/Users/[email protected]/EwsPlayground/debugging_find_calendar_folder.py", line 20, in <module>
    ).resolve()
      ^^^^^^^^^
  File "/opt/homebrew/lib/python3.12/site-packages/exchangelib/folders/queryset.py", line 187, in resolve
    return list(self.folder_collection.resolve())[0]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/homebrew/lib/python3.12/site-packages/exchangelib/folders/collections.py", line 335, in resolve
    yield from self.__class__(account=self.account, folders=resolveable_folders).get_folders(
  File "/opt/homebrew/lib/python3.12/site-packages/exchangelib/folders/collections.py", line 403, in get_folders
    yield from GetFolder(account=self.account).call(
  File "/opt/homebrew/lib/python3.12/site-packages/exchangelib/services/get_folder.py", line 55, in _elems_to_objs
    yield parse_folder_elem(elem=elem, folder=folder)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/homebrew/lib/python3.12/site-packages/exchangelib/services/common.py", line 978, in parse_folder_elem
    raise ValueError(f"Unsupported folder class: {folder}")
ValueError: Unsupported folder class: DistinguishedFolderId(id='calendar', mailbox=Mailbox(name=None, email_address='[email protected]', routing_type='SMTP', mailbox_type='Mailbox', item_id=None))

quzhi1 avatar May 14 '24 16:05 quzhi1

You're missing the Folder(...) part. Try copying the script exactly as I posted it.

ecederstrand avatar May 14 '24 17:05 ecederstrand

It is working again! Thanks @ecederstrand . I can close this issue.

quzhi1 avatar May 14 '24 17:05 quzhi1