在EWS中通过Exchangelib访问共享个人日历的推荐方法是什么
问题原因
你当前遍历ews_account.calendar.children只能获取到Bill自己邮箱下创建的日历文件夹,以及其他用户共享的非默认自定义日历(也就是你拿到的Interviews这类)。其他用户的默认日历属于对方邮箱的根日历节点,共享后不会同步到被共享人的calendar子节点列表里。
可用解决方案
方法1:调用EWS的GetSharedFolders接口拉取所有共享日历
exchangelib原生支持这个EWS操作,不需要提前知道共享人邮箱或日历ID,直接拉取所有授权给当前账号的共享文件夹,筛选类型为日历即可:
from exchangelib.errors import ErrorAccessDenied # 拉取所有共享给当前账号的日历类文件夹 shared_folders = ews_account.protocol.get_shared_folders( folder_type='calendar' ) for folder in shared_folders: # 输出共享日历名称、所属共享人邮箱 print(f"日历名称:{folder.name},共享人:{folder.owner.primary_smtp_address}")
注意:如果部分共享文件夹权限不足,会抛出ErrorAccessDenied异常,建议加异常捕获过滤无权限的条目
方法2:枚举全局地址列表用户的默认日历权限(可选扩展)
如果需要遍历全域用户的默认日历是否共享给当前账号,可以先拉取域内全局地址列表的所有有效邮箱,再逐个尝试挂载对方的默认日历:
# 先拉取全局地址列表所有用户 all_users = list(ews_account.contacts.global_address_list()) for user in all_users: try: # 尝试以委托权限挂载该用户的默认日历 shared_calendar = Account( primary_smtp_address=user.email_address, config=ews_account.config, autodiscover=False, access_type='delegate' ).calendar print(f"可访问的共享默认日历:{shared_calendar.name},所属人:{user.email_address}") except ErrorAccessDenied: # 无权限直接跳过 continue
该方法适用于域内用户量不大的场景,如果用户量极大不建议使用,会产生大量请求
额外排查点
如果上述方法还是拉不到对应的共享默认日历,检查两项配置:
- 确认共享时的权限范围是否包含「日历可见性」,部分版本Exchange默认共享默认日历时仅共享忙闲状态,不授予文件夹列表可见权限
- 服务账号的模拟权限是否包含
EWS Impersonation的完整权限,且没有被Exchange的应用权限策略限制共享文件夹访问
内容的提问来源于stack exchange,提问作者ZZZZZ
相关产品推荐
相关产品推荐

