EWS中的复制操作和扩展属性带来麻烦



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

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

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

这确实很有效,但我遇到了一个警告。

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

基本上:

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

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

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

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

我基本上看到两种选择:

  • 以某种方式阻止此扩展属性可复制

  • 阻止EWS发送我自己创建的项目的创建。我知道我可以在SyncFolderItems()调用中忽略ItemID,但我不确定如何在调用中跟踪项目ID,因为它们可能会根据文档更改

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

Exchange id也应该是您的唯一id。把你的id保留在物品上真的不值得——首先,这需要对该物品进行修改(即使是你造成了更改,也会产生更改事件(,其次,正如你已经注意到的那样,你最终可能会发现同一物品的重复或三重。

对于约会来说,情况更糟——每次传入的约会更新都会导致Outlook重新创建约会,导致使用新的id并清除您的自定义属性。

最新更新