EWS 中复制操作和扩展属性的问题

Woes with copy operation and extended properties in EWS

我的任务是通过服务双向同步两个邮箱中的联系人文件夹。 请耐心等待,因为这是我第一次在 C# 中使用 EWS。

为了唯一标识项目并跟踪同步更改,我对子文件夹使用 SyncFolderHierarchy(),对每个子文件夹中的项目使用 SyncFolderItems(),同时跟踪同步状态。

由于 folder/item ID 取决于邮箱、初始同步以及创建操作,我通过 Item.SetExtendedProperty()[使用扩展 属性 标记同步项目

这确实很好用,但我 运行 需要注意。

当用户在 Outlook 中复制和粘贴文件夹或联系人时,它还会复制唯一 ID(扩展 属性),使其不再那么唯一。 在那种情况下,我现在在一个邮箱中有两个具有相同 "unique" ID 的项目,并且现在对项目有一个不明确的匹配。

基本上:

  1. SyncFolderItems() 被调用,同步状态被保存
  2. 如果项目没有唯一 ID,则用唯一 ID 标记
  3. 用户复制并粘贴项目
  4. SyncFolderItems() 被调用(与之前的同步状态),returns 用户复制项目的 Create 事件
  5. 创建的项目已具有唯一 ID

现在,有人可能会争辩说只覆盖创建事件中项目的唯一 ID。

但是,这会导致以下问题:

当我将新项目从邮箱 A 同步到邮箱 B 时,我也创建了一个项目。 现在调用邮箱 A 上的 SyncFolderItems() 后,我还会为我自己的项目检索一个创建事件,在这种情况下,它合法地已经分配了一个不能被覆盖的唯一 ID。

我基本上看到两个选项:

有人对如何以不同方式处理此问题或实施任一选项有任何建议吗?

Exchange ID 也应该是您的 唯一 ID。将您的 id 保留在项目本身上真的不值得 - 首先,这需要对该项目进行修改(即使是您引起了更改,这也会产生一个更改事件),其次,因为您已经请注意,您最终可能会得到相同项目的重复项或一式三份。

约会更糟 - 每个传入的约会更新都会导致 Outlook 重新创建约会,导致使用新 ID 并清除您的自定义 属性。