使用EWS恢复隔离邮件:如何获取原始存储文件夹?
如何通过EWS Managed API获取隔离邮件的原始存储文件夹
由于Exchange中移动邮件会生成带新ItemId的新项,原邮件的父文件夹信息不会自动保留在隔离邮件中,推荐以下几种可行方案:
方案一:移动时主动记录原始文件夹信息(推荐)
这是最可靠的方式,在将邮件移至隔离文件夹前,把原始文件夹的唯一标识存储到隔离邮件的自定义扩展属性中,恢复时读取该属性即可定位原始文件夹。
步骤与代码示例
- 定义自定义扩展属性
// 用于存储原始文件夹UniqueId的自定义属性 ExtendedPropertyDefinition originalFolderIdProp = new ExtendedPropertyDefinition( DefaultExtendedPropertySet.PrivateStrings, "OriginalFolderUniqueId", MapiPropertyType.String); // 可选:同时存储原始文件夹名称,用于显示 ExtendedPropertyDefinition originalFolderNameProp = new ExtendedPropertyDefinition( DefaultExtendedPropertySet.PrivateStrings, "OriginalFolderName", MapiPropertyType.String);
- 移动邮件时写入属性
// 假设originalMail是待隔离的原始邮件,quarantineFolderId是隔离文件夹ID string originalFolderUniqueId = originalMail.ParentFolderId.UniqueId; string originalFolderName = originalMail.ParentFolder.DisplayName; // 为待移动的邮件添加自定义属性 originalMail.SetExtendedProperty(originalFolderIdProp, originalFolderUniqueId); originalMail.SetExtendedProperty(originalFolderNameProp, originalFolderName); originalMail.Update(ConflictResolutionMode.AlwaysOverwrite); // 执行移动操作 MoveItemResponse moveResponse = originalMail.Move(quarantineFolderId);
- 恢复时读取属性并移回原始文件夹
// 假设quarantinedItemId是隔离邮件的ItemId Item quarantinedMail = Item.Bind(service, quarantinedItemId, new PropertySet( BasePropertySet.IdOnly, originalFolderIdProp, originalFolderNameProp)); // 读取原始文件夹UniqueId string originalFolderUniqueId = null; if (quarantinedMail.TryGetProperty(originalFolderIdProp, out object idValue)) { originalFolderUniqueId = idValue.ToString(); } if (!string.IsNullOrEmpty(originalFolderUniqueId)) { // 绑定原始文件夹 Folder originalFolder = Folder.Bind(service, new FolderId(originalFolderUniqueId)); // 将邮件移回 quarantinedMail.Move(originalFolder.Id); }
方案二:通过Exchange审计日志追溯
如果Exchange开启了邮件移动审计功能,可以通过查询审计日志获取该邮件的原始位置。需要注意:
- 需提前在Exchange管理中心开启"邮件移动"审计策略
- 通过EWS的
SearchFilter查询审计日志条目,匹配邮件的InternetMessageId来定位移动记录,从中提取原始文件夹信息
方案三:通过InternetMessageId关联原始邮件
邮件的InternetMessageId在移动/复制操作中不会改变,可以通过该ID在整个邮箱中搜索原始邮件,进而获取其原始文件夹:
// 假设quarantinedMail是隔离邮件,先获取它的InternetMessageId string internetMessageId = quarantinedMail.InternetMessageId; // 搜索整个邮箱中相同InternetMessageId的邮件 SearchFilter filter = new SearchFilter.IsEqualTo(ItemSchema.InternetMessageId, internetMessageId); ItemView view = new ItemView(1); FindItemsResults<Item> results = service.FindItems(WellKnownFolderName.Root, filter, view); if (results.Items.Count > 0) { Item originalMail = results.Items[0]; Folder originalFolder = Folder.Bind(service, originalMail.ParentFolderId); // 执行恢复操作 }
局限性:如果原始邮件已被彻底删除(不在可恢复项目中),此方法失效。
内容的提问来源于stack exchange,提问作者yoxhall
相关产品推荐
相关产品推荐

