Office365 通过EWS通过移动关联消息

Office365 通过EWS通过移动关联消息,office365,exchangewebservices,Office365,Exchangewebservices,假设您正在构建一个从EWS向下同步消息体和元数据的应用程序。同步初始状态非常简单:调用 当试图通过移动来跟踪消息时,事情变得有点复杂。移动后,调用SyncFolderItems将在一个文件夹中返回Create,在另一个文件夹中返回Delete。您希望将这些关联起来,以便客户端可以避免重新下载邮件正文和附件。(同时,这样客户端就不会丢失与本地副本关联的任何元数据。)但是,在文件夹之间移动消息会更改其EWS ItemId,因此ItemId不能用于关联创建和删除 EWS文档表明,确实支持移动事件。但是

假设您正在构建一个从EWS向下同步消息体和元数据的应用程序。同步初始状态非常简单:调用

当试图通过移动来跟踪消息时,事情变得有点复杂。移动后,调用
SyncFolderItems
将在一个文件夹中返回Create,在另一个文件夹中返回Delete。您希望将这些关联起来,以便客户端可以避免重新下载邮件正文和附件。(同时,这样客户端就不会丢失与本地副本关联的任何元数据。)但是,在文件夹之间移动消息会更改其EWS ItemId,因此ItemId不能用于关联创建和删除

EWS文档表明,确实支持移动事件。但是流式传输通知,因此在建立流式传输连接之前,您仍然必须使客户端恢复同步。因此,流式通知不可能是一个完整的解决方案

另一个EWS选项是。与流式通知一样,拉式通知支持移动事件。与流式通知不同,请求订阅缓冲区更改。但是,如果在请求订阅到期时您的客户端处于脱机状态,那么您又回到了相同的情况。(尽管如此,因为这仍然是可行的。)

最后一个选项是使用ItemId以外的内容通过
SyncFolderItems
关联移动的项目:

  • PR\u SEARCH\u KEY
    在移动过程中起作用,但在复制时存在问题(因为复制的结果与原始的
    PR\u SEARCH\u KEY
    相同)

  • PR\u ENTRYID
    似乎和似乎:

在其存储中创建项时,MAPI存储提供程序将分配唯一的ID字符串。因此,在保存或发送Microsoft Outlook项目之前,不会为其设置EntryID属性。当项目移动到另一个存储区时,例如,从收件箱移动到Microsoft Exchange Server公用文件夹,或从一个个人文件夹(.pst)文件移动到另一个.pst文件,EntryID会发生更改。除非不移动项,否则解决方案不应依赖于唯一的EntryID属性。EntryID属性返回MAPI长期EntryID。


所以。。。通过EWS的移动关联项目的正确方法是什么?

有两件事可以帮助您:

第一次进近

我们通过为每个项目(本例中为日历项目)提供一个用户定义的属性(又称扩展属性)来解决这个问题,该属性包含EWS项目ID的副本(无论何时写入/更新)

每当我们读取要同步的项目时,我们都会检查该属性是否仍然与EWS项目ID匹配。如果不匹配,我们就知道该项目已被移动,并相应地进行处理(我们会清除用户定义的属性)

与其他一些用于记账的用户定义属性一起,这使我们能够维护Exchange中的项目与应用程序中的项目之间的完整性

第二次进近

有些边缘情况下,这不起作用(但我们忽略它们)。对于这些,使用EWS项目ID进行跟踪不再有效,建议使用UID/PidLidGlobalObject属性。我并不需要实际实现这一点,但这里有一些参考资料可以帮助您开始:














我无法详细说明要使用什么代码,因为我们的应用程序是用Delphi编写的,并且只使用SOAP调用来同步日历项目。

另一个选项是消息ID字段(来自RFC 5322),即来自的internetMessageId。该ID在移动过程中保持不变。然而,它在副本中也保持不变,这可能是您喜欢的,也可能不是您喜欢的