【问题标题】:Get Outlook Group Calendars using Pywin32 (win32com.client)使用 Pywin32 (win32com.client) 获取 Outlook 组日历
【发布时间】:2022-01-20 06:40:04
【问题描述】:

我正在尝试弄清楚如何访问我所属的不同 Outlook 组的日历。我正在使用 win32com 和 Python 3.9 来完成此任务,并且希望避免使用 RESTful/auth 令牌路线,因为这对于应该是插入一些日历约会的简单脚本来说是相当多的开销。

我可以使用以下代码自行预约:

import win32com.client

application = win32com.client.Dispatch('Outlook.Application')
namespace = application.GetNamespace('MAPI')

cal = namespace.GetDefaultFolder(9)
    
for item in cal.Items:
    print(item.Subject)

返回我个人日历中每个约会的主题行。

我也可以使用 GetSharedDefaultFolder 获得相同的信息:

application = win32com.client.Dispatch('Outlook.Application')
namespace = application.GetNamespace('MAPI')

recipient = namespace.createRecipient("{my_email}")
resolved = recipient.Resolve()

sharedCalendar = namespace.GetSharedDefaultFolder(recipient, 9)

for item in sharedCalendar.Items:
    print(item.Subject)

我读到您希望将创建所需日历的人的电子邮件/用户作为收件人传递,但我没有这样做。

在尝试使用创建者的电子邮件时,我收到以下错误:

pywintypes.com_error: (-2147352567, 'Exception occurred.', (4096, 'Microsoft Outlook', 'The operation failed because of a registry or installation problem. Restart Outlook and try again. If the problem persists, reinstall.', None, 0, -2147221219), None)

如果我尝试使用他们的 (lastName, firstName),我会得到以下信息:

pywintypes.com_error: (-2009857777, 'OLE error 0x8834010f', None, None)

请注意,我指的是 GROUP 日历,而不是共享日历。我不确定这两者之间是否真的有区别,但它们在 Outlook 中对我来说显示为不同的部分。

我一直在参考的一些参考资料(对于找到此页面并遇到此问题的其他人):
Read Outlook Events via Python
https://docs.microsoft.com/en-us/office/vba/api/outlook.namespace.getdefaultfolder(和相关页面)
Problem with read Outlook shared calendar via python
https://docs.microsoft.com/en-us/answers/questions/607061/how-to-create-new-events-share-calendar-with-pytho.html

【问题讨论】:

  • 您在 Outlook 中看到共享日历吗?
  • @EugeneAstafiev 是的,如果我正常打开 Outlook,我可以看到组日历。
  • 是公用文件夹吗?请参阅Create a Public Folder calendar in Exchange Online 了解更多信息。
  • @EugeneAstafiev 你必须被添加,它不是一个公共文件夹(除非我明白你所说的公共的意思)

标签: python outlook ms-office pywin32 win32com


【解决方案1】:

NameSpace.GetSharedDefaultFolder 方法用于委派方案,其中一个用户已将一个或多个默认文件夹(例如,他们的共享日历文件夹)的访问权限委派给另一个用户。因此,您需要确保用户作为授权访问您。

如果日历在 Outlook 的导航窗格中可见,您可以使用 NavigationGroups 对象访问它。您可以使用NavigationGroupsNavigationFolders 集合在导航窗格中遍历模块的组和文件夹层次结构。 NavigationModule 对象的NavigationGroups 集合包含导航模块中显示的每个导航组,而NavigationGroup 对象的NavigationFolders 集合包含导航组中显示的每个导航文件夹。通过组合使用这些集合,您可以枚举导航窗格中显示的导航模块的每个导航文件夹。这是示例 VBA 代码,您可以在其中了解获取所需日历所需的 OOM 属性方法:

Dim WithEvents objPane As NavigationPane 
 
Private Sub EnumerateActiveCalendarFolders() 
 Dim objModule As CalendarModule 
 Dim objGroup As NavigationGroup 
 Dim objFolder As NavigationFolder 
 Dim intCounter As Integer 
 
 On Error GoTo ErrRoutine 
 
 ' Get the NavigationPane object for the 
 ' currently displayed Explorer object. 
 Set objPane = Application.ActiveExplorer.NavigationPane 
 
 ' Get the CalendarModule object, if one exists, 
 ' for the current Navigation Pane. 
 Set objModule = objPane.Modules.GetNavigationModule(olModuleCalendar) 
 
 ' Iterate through each NavigationGroup contained 
 ' by the CalendarModule. 
 For Each objGroup In objModule.NavigationGroups 
 ' Iterate through each NavigationFolder contained 
 ' by the NavigationGroup. 
 For Each objFolder In objGroup.NavigationFolders 
 ' Check if the folder is selected. 
 If objFolder.IsSelected Then 
 intCounter = intCounter + 1 
 End If 
 Next 
 Next 
 
 ' Display the results. 
 MsgBox "There are " & intCounter & " selected calendars in the Calendar module." 
 
EndRoutine: 
 On Error GoTo 0 
 Set objFolder = Nothing 
 Set objGroup = Nothing 
 Set objModule = Nothing 
 Set objPane = Nothing 
 intCounter = 0 
 Exit Sub 
 
ErrRoutine: 
 MsgBox Err.Number & " - " & Err.Description, _ 
 vbOKOnly Or vbCritical, _ 
 "EnumerateActiveCalendarFolders" 
End Sub

Outlook 对象模型对于所有类型的编程语言都是通用的,因此识别完成工作所需的属性和方法的顺序并不需要付出太多努力。

【讨论】:

  • 感谢您的新领导,现在正在解决这个问题,看看它是否是我正在寻找的。​​span>
  • objPane = application.ActiveExplorer() 只返回 none,这意味着它没有 NavigationPane 属性
  • 只有在创建了资源管理器窗口的情况下才能使用这种方式。 Explorers.Add 方法创建资源管理器窗口的新实例。
  • 啊,谢谢,我完全不熟悉 COM 的工作原理,并且从一开始就有错误的想法。我现在可以访问我想要的日历了
猜你喜欢
  • 2020-09-02
  • 1970-01-01
  • 2015-10-02
  • 1970-01-01
  • 1970-01-01
  • 2016-09-25
  • 2022-11-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多