如何通过EWS Managed API获取Exchange日历特定实例的定期主项
解决方案
由于你的planner@exchange.com账户拥有目标用户日历的读写委托权限,无需用户密码即可访问其日历,可通过以下步骤获取对应定期主项:
提取目标实例的关键属性
先绑定到你已有的2月26日约会实例,获取其SeriesId(关联定期系列的唯一标识)和组织者邮箱:Appointment occurrence = Appointment.Bind(service, occurrenceItemId, new PropertySet(BasePropertySet.IdOnly, AppointmentSchema.SeriesId, AppointmentSchema.Organizer)); Guid seriesId = occurrence.SeriesId; string organizerEmail = occurrence.Organizer.Address;访问组织者的日历文件夹
利用委托权限,直接构造组织者的日历FolderId:FolderId organizerCalendarId = new FolderId(WellKnownFolderName.Calendar, organizerEmail);搜索定期主项
使用SearchFilter筛选出组织者日历中AppointmentType为RecurringMaster且SeriesId与目标实例匹配的项目:SearchFilter filter = new SearchFilter.SearchFilterCollection(LogicalOperator.And, new SearchFilter.IsEqualTo(AppointmentSchema.AppointmentType, AppointmentType.RecurringMaster), new SearchFilter.IsEqualTo(AppointmentSchema.SeriesId, seriesId)); ItemView view = new ItemView(1); // 只需要返回一个主项 FindItemsResults<Item> results = service.FindItems(organizerCalendarId, filter, view); if (results.Items.Count > 0) { Appointment recurringMaster = results.Items[0] as Appointment; // 后续业务逻辑处理 }
备选方案(若SeriesId不可用)
如果目标实例的SeriesId为空(极端情况),可通过主题、时间范围结合 recurrence 模式特征筛选:
SearchFilter filter = new SearchFilter.SearchFilterCollection(LogicalOperator.And, new SearchFilter.IsEqualTo(AppointmentSchema.Subject, occurrence.Subject), new SearchFilter.IsEqualTo(AppointmentSchema.AppointmentType, AppointmentType.RecurringMaster), // 筛选主项的 recurrence 模式覆盖目标实例的时间 new SearchFilter.LessThanOrEqualTo(AppointmentSchema.Start, occurrence.Start), new SearchFilter.GreaterThanOrEqualTo(AppointmentSchema.End, occurrence.End));
关键说明
- 委托权限允许
planner@exchange.com直接访问目标用户的日历,无需额外认证; - 优先使用
SeriesId筛选,这是最精准的关联方式,避免主题重复导致的误匹配; - 若调用
BindToRecurringMaster失败,本质是因为该实例在planner日历中被标记为Single类型,但在组织者日历中它仍是定期系列的一部分,因此必须从组织者日历中获取主项。
内容的提问来源于stack exchange,提问作者Dmitry Melnikov
相关产品推荐
相关产品推荐

