如何使用Graph API恢复已删除的事件?
背景信息
我们当前正在将功能从EWS迁移到Microsoft Graph API(Java版本)。我们需要实现删除日历事件后再通过编程方式恢复它们的能力。虽然我们的EWS实现运行良好,但我们在使用Graph API时难以定位被删除的事件。
当前EWS实现(可用)
在EWS中,我们使用 DeleteMode.HardDelete,然后在 RecoverableItemsPurges 文件夹中搜索,将项重新放回日历。
// How we delete meeting from calendar
if (msg instanceof MeetingMessage) {
MeetingMessage meetingMessage = MeetingMessage.bind(service, msg.getId());
ItemId masterId = meetingMessage.getAssociatedAppointmentId();
if (masterId != null) {
Appointment appointment = Appointment.bind(service, masterId);
appointment.delete(DeleteMode.HardDelete);
}
}
// How we restore the message
ItemView itemView = new ItemView(EwsServer.FOLDER_VIEW_PAGE_SIZE);
itemView.setTraversal(ItemTraversal.Shallow);
SearchFilter filterColl = new SearchFilter.SearchFilterCollection(
LogicalOperator.And,
new SearchFilter.IsEqualTo(ItemSchema.Subject, message.getSubject()),
new SearchFilter.IsEqualTo(EmailMessageSchema.Sender, message.getSender().getAddress())
);
FindItemsResults<Item> deletedItems = server.getExchangeService()
.findItems(WellKnownFolderName.RecoverableItemsPurges, filterColl, itemView);
if (deletedItems.getItems().size() > 0) {
for (Item item : deletedItems.getItems()) {
item.move(WellKnownFolderName.Calendar);
break;
}
}
Graph API实现(不可用)
使用Graph API时,删除后无法在Recoverable Items文件夹中找到该事件。
删除代码:
graphClient
.users().byUserId(mailboxBeingScanned)
.calendar().events().byEventId(eventId)
.permanentDelete().post();
// OR we have tried this as well
graphClient
.users().byUserId(mailboxBeingScanned)
.calendar().events().byEventId(eventId).delete()
尝试的恢复代码:我们已经尝试使用 internetMessageId 分别在 recoverableitemspurges、deleteditems 和 recoverableitemsdeletions 进行搜索,但返回的集合始终为空。
MessageCollectionResponse eventMessage = graphClient.users().byUserId(mailboxBeingScanned)
.mailFolders().byMailFolderId("recoverableitemspurges")
.messages()
.get(requestConfiguration -> {
requestConfiguration.queryParameters.filter = "internetMessageId eq '<MN2PR13...prod.outlook.com>'";
});
问题
- 在Graph中对日历事件使用
permanentDelete()/delete()时,它会落在与EWS不同的文件夹吗? - 针对日历事件,在 “Recoverable Items” 分区查询项的正确
mailFolderId或端点是什么?
解决方案
当你执行permanentDelete时,该项目应被放入RecoverableItemsPurges文件夹,随后受到该邮箱的特定保留期限的约束。
Graph的日历端点目前不允许访问Recoverable Items(以及非事件文件夹),Messages端点也不暴露事件项。未来可能会变化,例如对联系人允许访问 https://graph.microsoft.com/v1.0/me/contactFolders/RecoverableItemsDeletions/contacts,但目前尚未公布关于事件的相关支持。
目前有一种方法可以在需要时访问这些项目并将其恢复:使用新的导入/导出API,它能提供对完整项级的访问权限 https://learn.microsoft.com/en-us/graph/mailbox-import-export-concept-overview,但确实需要一些提升权限。