【问题标题】:Read Outlook Events via Python通过 Python 阅读 Outlook 事件
【发布时间】:2014-02-24 00:02:43
【问题描述】:

Outlook 有一些需要 - 比如显示多个月视图

我决定尝试一下,通过 Python 提取事件数据(然后想办法很好地显示它)。 Google 的结果很差。

我的目标是:

  • 阅读共享日历
  • 读取开始、结束、主题、创建者等事件信息。

这就是我收集到的(灵感来自this site

import win32com.client, datetime
from dateutil.relativedelta import relativedelta

Outlook = win32com.client.Dispatch("Outlook.Application")
ns = Outlook.GetNamespace("MAPI")

appointments = namespace.GetDefaultFolder(9).Items 
# TODO: Need to figure out howto get the shared calendar instead Default [9] 
# (I have placed the shared folder into a separate folder - don't know if it matters)
# I would just like the user to select which calendar to execute on
appointments.Sort("[Start]")
appointments.IncludeRecurrences = "True"
begin = date.today().strftime("%m%d%Y")
end = (date.today() + relativedelta( months = 3 )).strftime("%m%d%Y")
appointments = appointments.Restrict("[Start] >= '" +begin+ "' AND [END] >= '" +end+ "'")

我如何遍历事件并阅读它们?

【问题讨论】:

  • 您的意思是ns.GetDefaultFolder(9) 而不是namespace.?如果我尝试您的代码,我会收到 NameError。

标签: python python-2.7 outlook-2010 win32com


【解决方案1】:

从这里我需要帮助来遍历事件并阅读它们。

基本上,您所要做的就是遵循 Microsoft 的 COM API 文档。例如,Restrict() 方法返回 AppointmentItem 对象,这些对象记录在 Outlook 2010 的 AppointmentItem Object。因此,从文件夹开始,您可以按如下方式获取和列出约会:

# Get the AppointmentItem objects
# http://msdn.microsoft.com/en-us/library/office/aa210899(v=office.11).aspx
appointments = someFolder.Items

# Restrict to items in the next 30 days (using Python 3.3 - might be slightly different for 2.7)
begin = datetime.date.today()
end = begin + datetime.timedelta(days = 30);
restriction = "[Start] >= '" + begin.strftime("%m/%d/%Y") + "' AND [End] <= '" +end.strftime("%m/%d/%Y") + "'"
restrictedItems = appointments.Restrict(restriction)

# Iterate through restricted AppointmentItems and print them
for appointmentItem in restrictedItems:
    print("{0} Start: {1}, End: {2}, Organizer: {3}".format(
          appointmentItem.Subject, appointmentItem.Start, 
          appointmentItem.End, appointmentItem.Organizer))

请注意,我必须对限制表达式使用稍微不同的时间格式("%m/%d/%Y" 而不是"%m%d%Y")。正确的解决方案是使用 Outlook 的 Format 函数,如 http://msdn.microsoft.com/en-us/library/office/ff869597(v=office.14).aspxDate 部分所述。另请注意,我使用的是 Python 3.3,因此您可能必须使用不同的函数来创建日期。在任何情况下,出于测试目的,您都可以使用硬编码表达式,例如 "[Start] &gt;= '02/03/2014' AND [End] &lt;= '03/05/2014'"

要获得共享日历,以下代码应该可以工作 - 这是 API 文档中的常用顺序,但是我无法真正让它工作,但这可能是由于不同的后端服务器(未使用Exchange 服务器):

recipient = namespace.createRecipient("User Name")
resolved = recipient.Resolve()
sharedCalendar = namespace.GetSharedDefaultFolder(recipient, 9)

要将所有可用文件夹显示为树,您可以使用类似

def folderTree(folders, indent = 0):
    prefix = ' ' * (indent*2)
    i = 0
    for folder in folders:
        print("{0}{1}. {2} ({3})".format(prefix, i, folder.Name, folder.DefaultItemType))
        folderTree(folder.Folders, indent + 1)
        i = i + 1

...
folderTree(namespace.Folders)

要通过路径查找文件夹(例如,在“Internet 日历”文件夹下查找日历文件夹“Norfeld@so.com”),您可以使用类似

def findFolder(folders, searchPath, level = 0):
    for folder in folders:
        if folder.Name == searchPath[level]:
            if level < len(searchPath)-1:
                # Search sub folder
                folder = findFolder(folder.folders, searchPath, level+1)
            return folder
    return None

...
sharedCalendar = findFolder(namespace.Folders, ["Internet Calendars", "Norfeld@so.com"])

另见:

【讨论】:

  • 感谢您的回答 - 所以我的限制字符串命令是错误的。我发现很难理解 MS API。我将如何选择另一个日历而不是默认日历。认为循环遍历所有日历的名称会很好。
  • 我同意 COM API 不容易阅读 - 但基本上,模型很简单:有些对象具有方法和属性(以及事件)。可以调用方法并可能返回结果,例如对另一个对象的引用。可以读取属性(如果不是只读的,也可以写入),并且读取可能会再次导致对另一个对象的引用。一些方法/属性返回可以迭代的 COM 集合,它无缝集成到 Python 中,以便您可以使用for ... in ...
  • 不是我没试过。但只是不能让你的文件夹树工作——我需要它来获取感兴趣的日历。我没有在 python 中使用类。
  • for folder in ns.Folders: print folder.Name 给我“Internet 日历”“SharePoint 列表”“my@mail.com”
  • 假设我想在“Internet 日历”中获取日历 - 如何将收件人名称定义为获取“Internet 日历”文件夹中日历的字符串
猜你喜欢
  • 2020-10-05
  • 2021-05-15
  • 2014-12-25
  • 2014-05-20
  • 2022-07-14
  • 1970-01-01
  • 2023-02-24
  • 2010-10-16
  • 2011-07-01
相关资源
最近更新 更多