Read Outlook Events via Python

后端 未结 1 1794
不思量自难忘°
不思量自难忘° 2020-12-04 22:45

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

So I decided to give it a try by pulling out the event data via python (and then figure a way to

1条回答
  •  执笔经年
    2020-12-04 23:17

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

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

    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'"

    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)
    

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

    See also:

    • 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

    0 讨论(0)
提交回复
热议问题