Проблема с чтением общего календаря Outlook через python

Пытаюсь сделать приложение для чтения событий из общего календаря Outlook. Я использую Python 3.8.0 на win10. Вот моя функция для этого.

 def getSharedCalendarEntries(TS_name, days=1000): #TS_name is name of shared calendar
        MailboxToAccess = '[email protected]'
        Outlook = win32com.client.Dispatch("Outlook.Application")
        namespace = Outlook.GetNamespace("MAPI")
        recipient = namespace.createRecipient(MailboxToAccess)
        resolved = recipient.Resolve()
        sharedCalendar = namespace.GetSharedDefaultFolder(recipient, 9).Folders(TS_name).Items 
        sharedCalendar.Sort("[Start]")
        sharedCalendar.IncludeRecurrences = 'True'
        today = datetime.datetime(2019,1,1)
        begin = today.date().strftime('%d/%m/%Y')
        tomorrow = datetime.timedelta(days=days)+today
        end = tomorrow.date().strftime('%d/%m/%Y')
        sharedCalendar = sharedCalendar.Restrict("[Start] >= '" +begin+ "' AND [END] <= '" +end+ "'")
        events = {'Start':[],'End':[],'Subject':[],'Duration':[]}
        mEv = []
        for app in sharedCalendar: #petla po rezerwacjach
            adate = datetime.datetime(app.Start.year, app.Start.month, app.Start.day).date()
            events['Start'].append(adate)
            aend = datetime.datetime(app.End.year, app.End.month, app.End.day).date()
            events['End'].append(aend)
            events['Duration'].append(int(app.Duration/1440))
            events['Subject'].append(app.Subject)
            mEvent = Event(adate, aend, int(app.Duration/1440), app.Subject)
            mEv.append(mEvent)
        return mEv

Все работало и я мог читать события, но вдруг что-то произошло (я ничего не менял в коде) и у меня такая ошибка:

Файл "C: \ Users \ user_catalog \ Desktop \ outread.py", строка 60, в getSharedCalendarEntries sharedCalendar = namespace.GetSharedDefaultFolder (получатель, 9) .Folders (TS_name) .Items

Файл "C: \ Users \ user_catalog \ AppData \ Local \ Programs \ Python \ Python38 \ lib \ site-packages \ win32com \ client \ dynamic.py", строка 197, в вызове возвращает self._get_good_object_ (self. oleobj .Invoke (* allArgs), self. olerepr .defaultDispatchName, None) pywintypes.com_error: (-2147352567, 'Произошло исключение.', (4096, "Microsoft Outlook", "Не удалось выполнить операцию. Не удалось найти объект.", Нет, 0, -2147221233), Нет)

У меня был доступ только для чтения к общим календарям. Владелец общих календарей сказал, что она вышла из сети, и время выхода было в то же время, когда мое приложение перестало работать.

У кого-нибудь из вас была такая проблема или есть несколько советов для меня? Заранее спасибо!

Пио


person user12409353    schedule 21.11.2019    source источник


Ответы (1)


Не могли бы вы попробовать приведенный ниже код? Он предоставит вам фрейм данных с темой, временем встречи, временем начала и временем окончания.

import win32com.client, datetime
import pandas as pd
from datetime import time, timedelta

#connect to outlook
outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")
appointments  = outlook.GetDefaultFolder(9).Items #Calendário

#use these 2 lines to short the list
appointments.Sort('[Start]')

#Recurrent events  only show the first start date, use the following to get the REAL occurrence of the event.
appointments.IncludeRecurrences = 'True'

#Beginning of the week(monday) to end of week(friday)
today = datetime.date.today()
start = today - timedelta(days=today.weekday())
end = start + timedelta(days=5)

#String of restriction time that will be used to filter dates on outlook
restriction = "[Start] >= '" + start.strftime("%d/%m/%Y") + "' AND [End] < '" +end.strftime("%d/%m/%Y") + "'"
print(restriction)
restrictedItems = appointments.Restrict(restriction)


#create empty data frame with columns to be fetched
i = 0
calendario = pd.DataFrame(columns=['Subject', 'When', 'Start Time','End Time'])


#Loop on items to fill the dataframe
for appointmentItem in restrictedItems:
    
    calendario.loc[i] = [appointmentItem.Subject,appointmentItem.Start.strftime("%m/%d/%Y"),appointmentItem.Start.strftime("%H:%M"),appointmentItem.End.strftime("%H:%M")] 
    i = i + 1

#display dataframe   
calendario

person mch22    schedule 20.08.2020