在 exchangelib 中访问 "Other Calendars"

Accessing "Other Calendars" in exchangelib

我目前正在使用 exchangelib 连接到 Office365 EWS。我目前的情况是我想访问我们会议室的日历。当我从 Outlook 中单击 "Add Room" 选项时,他们的日历就会显示出来。当我将它们添加到日历视图的 "Other Calendars" 部分时,它们也会出现。

当我尝试使用会议室的 e-mail 地址作为帐户,然后检查日历时,出现以下错误:

exchangelib.errors.ErrorFolderNotFound: No useable default Calendar folders

所以我想我应该通过登录访问日历;就像我正在查看 Outlook 中的“其他日历”部分一样。问题是我似乎无法弄清楚如何访问这些日历。我可以毫无问题地访问我自己的。

当我查看 EWS 的 C# 实现时,有一种方法可以搜索文件夹,您可以在其中找到其他日历。我在 exchangelib 中没有看到这样的东西。

举个例子:

credentials = Credentials(username='My email address', password='My password')
config = Configuration(credentials=credentials, server='outlook.office365.com', has_ssl=True)
email = # My e-mail address (I also attempted with the room's e-mail address)

account = Account(primary_smtp_address=email, credentials=credentials,
                  autodiscover=False, config=config)

for f in account.folders:
    print f

结果:

<class 'exchangelib.folders.Calendar'>
<class 'exchangelib.folders.Contacts'>
<class 'exchangelib.folders.Tasks'>
<class 'exchangelib.folders.Messages'>
<class 'exchangelib.folders.Folder'>

'Calendar'选项不能迭代,但'Folder'选项可以。

for f in account.folders[Folder]:
    print f

结果:

Folder (Conversation Action Settings)
Folder (Conversation History)
Folder (Files)
Folder (Journal)
Folder (Notes)
Folder (Quick Step Settings)
Folder (RSS Feeds)
Folder (Social Activity Notifications)
Folder (Yammer Root)

None 这些选项似乎能满足我的需求。

如有任何帮助,我们将不胜感激!

提前致谢

编辑

我发现了account.root.get_folders()的魔力。我现在可以看到一个非常大的文件夹列表。但是,我仍然没有看到似乎可用于其他日历的日历。

我一直在阅读其他人在 C# 中使用的解决方案并遇到了这个线程:

EWS - Access All Shared Calendars

他们似乎有某种搜索过滤器,但我无法在 exchangelib 库中找到它。

然后我发现了另一个话题:

https://social.msdn.microsoft.com/Forums/en-US/2bfe798e-501f-421e-9a9a-76ae7eaf57c8/other-calendars-in-ews?forum=exchangesvrdevelopment

这个谈到了其他日历如何成为日历 object 下的一个文件夹。但是,当我查询 account.calendar.get_folders() 时返回 0 个结果。

No useable default Calendar folders 错误表示 exchangelib 无法在该帐户的文件夹中找到默认日历文件夹。这可能有很多原因。您或许仍能在 Account.folders.

中找到日历文件夹

您可以通过查询得到其他日历文件夹account.calendar.children:

for cal_folder in account.calendar.children:
    if -1 !=str(cal_folder).find('my_Calendar'):
        myCalendar=cal_folder
        break

for item in myCalendar.all():
    print(item.subject)

只是为了添加一些上下文以防这对其他人有帮助,我们 运行 在用户 A 可以访问用户 B 的收件箱但无法访问用户 B 的日历的情况下进行此操作。如果将用户A添加到用户B的日历共享,问题就解决了。