当前位置 : 主页 > 手机开发 > 无线 >

office365 – 通过EWS移动关联消息

来源:互联网 收集:自由互联 发布时间:2021-06-10
假设您正在构建一个从EWS同步消息体和元数据的应用程序.让您的初始状态同步非常简单:拨打 SyncFolderHierarchy to get the folder list, SyncFolderItems to get the message ItemIds, and GetItem to get the mess
假设您正在构建一个从EWS同步消息体和元数据的应用程序.让您的初始状态同步非常简单:拨打 SyncFolderHierarchy to get the folder list, SyncFolderItems to get the message ItemIds, and GetItem to get the message bodies and metadata.

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

EWS文档建议subscribing to streaming notifications,它确实支持Move事件.但是流式传输通知aren’t buffered when the stream is not connected,因此您仍然需要在建立流式连接之前使客户端恢复同步.因此,流式传输通知不能是完全相关的移动解决方案.

另一个EWS选项是subscribing to pull notifications.与流式通知一样,拉动通知支持移动事件.与流式通知不同,拉订阅缓冲区更改.但是,如果您的客户端在请求订阅到期时处于脱机状态,那么您将回到相同的状态. (尽管如此,从a pull subscription can be scoped to last a full day开始,这可能仍然可行.)

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

> PR_SEARCH_KEY通过移动进行处理,但副本有问题(因为副本最终与原始PR_SEARCH_KEY相同)
> PR_ENTRYID似乎是like it’d be workable for this purpose,似乎是better than PR_RECORD_KEY

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

那么……通过EWS移动来关联项目的正确方法是什么?

有两件事可以帮助你:

第一种方法

我们通过为每个项目(在我们的案例中为日历项目)提供包含EWS项目ID的副本(每当我们编写/更新它)的用户定义属性(a.k.a.扩展属性)来解决这个问题.

每当我们读取项目以进行同步时,我们都会检查该属性是否仍然与EWS项目ID匹配.如果没有,我们知道该项已被移动并相应地处理它(我们清除了User Defined属性).

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

第二种方法

有一些边缘情况,这不起作用(但我们忽略它们).对于那些,使用EWS项ID进行跟踪不再有效,建议使用UID / PidLidGlobalObject属性.我没有必要实际实现这一点,但这里有一些参考来帮助你入门:

“Exchange calendar: Is ConversationId a good identifier of master events for FindItem occurrences?”
“The appointment.Id.UniqueID changed”
“EWS API- Differences in ICalUid returned when appointments are created by Office 365 account vs. Microsoft Outlook Mac Client”
“EWS: UID not always the same for orphaned instances of the same meeting”

“Property: UID”
“PidLidGlobalObjectId Canonical Property”
“PidLidCleanGlobalObjectId Canonical Property”
“Getting GlobalObjectID from UID(Appointment created from IPhone)”
“Developer information about the calendar changes in Outlook 2003 Service Pack 2, in Exchange Server 2003 Service Pack 2, and in later versions of Exchange Server and of Outlook”

“Working with extended properties by using the EWS Managed API 2.0”

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

网友评论