4

我正在使用 C# 中的 Exchange Managed API 访问来自 Exchange 2010 的数据。我正在尝试返回返回的电子邮件项目的唯一标识符,以便稍后在单独的调用中通过该 ID 检索它们(即第一次调用返回所有邮件项目,然后再次调用以检索单个项目以将其标记为已读等)。我遇到的问题是作为每个邮件项目的 UniqueId 返回的字符串是相同的。最重要的是,每个附件项目的 Id 也是相同的字符串。

我正在使用此代码从收件箱文件夹中检索未读邮件。

var maxItems = 10;
var searchFilter = new SearchFilter.IsEqualTo(EmailMessageSchema.IsRead, false);
var itemView = new ItemView(maxItems);
FindItemsResults<Item> mailItems = service.FindItems(WellKnownFolderName.Inbox, searchFilter, itemView);

当我解析 mailItems 集合中的每个项目时,每个项目的 Id.UniqueId.ToString() 都是相同的。

我在这里想念什么?

谢谢

4

2 回答 2

6

在深入挖掘之后,似乎为了获取特定邮件项目的唯一标识符,您需要 Id 的 UniqueId 和 ChangeKey 属性。使用 Exchange Web 服务时,这两个都是必需的。

但是,在托管 API 中,当您创建 ItemId 对象时,它只接受 UniqueId 属性并且不提供 ChangeKey 属性的设置器。

因此,经过一番思考,我能够设置该属性,然后绑定到该项目。

var itemId = new ItemId(uniqueId);
PropertyInfo prop = typeof(ItemId).GetProperty("ChangeKey");
prop.SetValue(itemId, changeKey, null);
var emailMessage = EmailMessage.Bind(service, itemId);

我观察到的行为是多个项目的“UniqueId”属性可能相同。但是,“UniqueId”和“ChangeKey”的组合从未重复(即使我复制了一个邮件项目,这两个单独的项目具有不同的 ChangeKey 值)。

为什么 API 不允许您在新的 ItemId 对象上设置 ChangeKey,这超出了我的理解。

于 2012-10-26T19:16:40.847 回答
6

唯一 ID 对于 EWS 项目是唯一的。我遇到了这个问题,因为我认为我遇到了同样的问题。事实证明,它们只是区分大小写。

如果要将 id 保存在 db 中,则需要确保 id 的列排序规则区分大小写。我把我的从SQL_Latin1_General_Cp1_CI_AS改为SQL_Latin1_General_Cp1_CS_AS。其中 CI 不区分大小写,CS 区分大小写。

您根本不必使用 ChangeKey。

有关详细信息,请参阅Exchange 中的 EWS 标识符。

要记住的一件事,即链接中的内容,是 id 在移动时可能会发生变化。这是因为它们被复制到新位置而原始位置被删除。

于 2015-07-18T18:36:16.223 回答