通过 Python 读取 Outlook 事件 [英] Read Outlook Events via Python

查看:100
本文介绍了通过 Python 读取 Outlook 事件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

Outlook 有一些需要的东西 - 比如显示多月视图

Outlook has some things to desire - like showing multiple month view

所以我决定通过python提取事件数据来尝试一下(然后想办法很好地显示它).Google 给了我 pore 结果,但 stackoverflow 以前在使用 win32com 和 Outlook 方面非常有帮助.

So I decided to give it a try by pulling out the event data via python (and then figure a way to display it nicely). Google is giving me pore results, but stackoverflow has been very helpful previously in regards to using win32com and outlook.

我的目标如下

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

我还没有走多远,但这就是我得到的(灵感来自 本网站)

I haven't got far, but this is what I got together (with inspiration from 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+ "'")

从这里我需要帮助循环遍历事件并阅读它们.任何帮助都受到高度赞赏.

From here I need help with looping through the events and read them. Any help is highly appreciated.

推荐答案

从这里我需要帮助循环遍历事件并阅读它们.

From here I need help with looping through the events and read them.

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

Basically, all you have to do is to follow the COM API documentation from Microsoft. For example, the Restrict() method returns AppointmentItem objects which are documented at AppointmentItem Object for Outlook 2010. So, starting with a folder, you can get and list the appointments as follows:

# 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).aspx日期部分.另请注意,我使用的是 Python 3.3,因此您可能必须使用不同的函数来创建日期.在任何情况下,出于测试目的,您都可以使用硬编码表达式,例如 "[Start] >= '02/03/2014' AND [End] <='03/05/2014'"

Note that I had to use a slightly different time format for the restriction expression ("%m/%d/%Y" instead of "%m%d%Y"). The proper solution would be to use Outlook's Format function as documented at http://msdn.microsoft.com/en-us/library/office/ff869597(v=office.14).aspx, section Date. Note also that I was using Python 3.3, so you might have to use different functions to create the dates. In any case, for testing purposes, you can use a hard coded expression like "[Start] >= '02/03/2014' AND [End] <= '03/05/2014'"

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

To get a shared calendar, the following code should work - This is the usual sequence found in the API documentation, however I was not able to actually get it working, but this could be due to a different backend server (not using an Exchange server):

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

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

To show all available folders as a tree, you can use something like

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"),您可以使用类似

To look up a folder by its path (e.g. to find the calendar folder "Norfeld@so.com" below the "Internet Calendars" folder), you can use something like

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"])

另见:

  • Outlook Object Model Reference
  • Some more samples how to use the COM API (as part of my "Python samples" project)
  • A standalone Python script to show the folders tree and to lookup folders by path name

这篇关于通过 Python 读取 Outlook 事件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆