You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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)

解决方案

问题根源有两个:

  1. 操作顺序错误:必须先开启IncludeRecurrences并执行排序,再用Restrict做筛选。如果先筛选再设置重复项参数,Outlook无法正确展开重复约会的实例。
  2. 日期格式不兼容: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 15:41:07