如何使用Graph API恢复已删除的事件?

后端开发 2026-07-11

背景信息

我们当前正在将功能从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 分别在 recoverableitemspurgesdeleteditemsrecoverableitemsdeletions 进行搜索,但返回的集合始终为空。

MessageCollectionResponse eventMessage = graphClient.users().byUserId(mailboxBeingScanned)
    .mailFolders().byMailFolderId("recoverableitemspurges")
    .messages()
    .get(requestConfiguration -> {
        requestConfiguration.queryParameters.filter = "internetMessageId eq '<MN2PR13...prod.outlook.com>'";
    });

问题

  1. 在Graph中对日历事件使用 permanentDelete()/delete() 时,它会落在与EWS不同的文件夹吗?
  2. 针对日历事件,在 “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,但确实需要一些提升权限。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章