如何修改Python+win32com代码获取Outlook重复约会的各实例日期?
问题
用Python的win32com库爬取Outlook客户端日历A的约会时,碰到了重复约会的显示问题:比如日历里有个2024年每月1日的重复约会,我想导出12个对应不同日期的实例(01/01/2024、02/01/2024...),但现在导出的结果是12次重复显示01/01/2024。我已经设置了IncludeRecurrences = True,但问题还是没解决,现有代码如下:
import win32com.client, datetime import time import os import email import imaplib import pandas as pd import xlsxwriter import datetime as dt import calendar as ccc from datetime import timedelta MailboxToAccess = "my_mail@outlook.com" outlook = win32com.client.Dispatch('Outlook.Application').GetNamespace('MAPI') recip = outlook.CreateRecipient(MailboxToAccess) mail_box = outlook.Folders["A_mailbox"] calendar = mail_box.Folders["Calendar"].Items calendar.IncludeRecurrences = True calendar.Sort('[Start]') _today=datetime.date.today() first_day = datetime.date(_today.year, _today.month, 1) this_month_end = datetime.datetime(_today.year, _today.month, ccc.monthrange(_today.year, _today.month)[1]) restriction = "[Start] >= '" + str(first_day) + "' AND [END] <= '" + str(this_month_end) + "'" print (restriction) calendar = calendar.Restrict(restriction)
解决方案
问题根源有两个:
- 操作顺序错误:必须先开启
IncludeRecurrences并执行排序,再用Restrict做筛选。如果先筛选再设置重复项参数,Outlook无法正确展开重复约会的实例。 - 日期格式不兼容:Python直接转字符串的日期格式,Outlook可能无法准确识别,需要换成它支持的格式(比如
mm/dd/yyyy)。
直接修改代码即可,调整顺序+更换日期格式,修改后的完整代码:
import win32com.client import datetime import calendar as ccc MailboxToAccess = "my_mail@outlook.com" outlook = win32com.client.Dispatch('Outlook.Application').GetNamespace('MAPI') mail_box = outlook.Folders["A_mailbox"] calendar = mail_box.Folders["Calendar"].Items # 核心调整:先开启重复项包含+排序,再执行筛选 calendar.IncludeRecurrences = True calendar.Sort('[Start]') _today = datetime.date.today() first_day = datetime.date(_today.year, _today.month, 1) this_month_end = datetime.datetime(_today.year, _today.month, ccc.monthrange(_today.year, _today.month)[1]) # 转换为Outlook可识别的日期格式 start_str = first_day.strftime("%m/%d/%Y") end_str = this_month_end.strftime("%m/%d/%Y") restriction = f"[Start] >= '{start_str}' AND [End] <= '{end_str}'" print(restriction) calendar_filtered = calendar.Restrict(restriction) # 遍历验证,可查看每个重复实例的正确日期 for appt in calendar_filtered: print(f"约会主题: {appt.Subject}, 开始日期: {appt.Start.strftime('%Y-%m-%d')}")
这样修改后,Outlook会自动展开所有重复约会的实例,每个实例的Start属性会显示对应的实际日期,不会再重复显示原始约会的起始日了。
内容的提问来源于stack exchange,提问作者user23525641
相关产品推荐
相关产品推荐

