Exchange托管API - 所有返回的EmailMessages具有相同的唯一Id字符串

Joh*_*man 3 c# email exchange-server

我在C#中使用Exchange托管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);
Run Code Online (Sandbox Code Playgroud)

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

我在这里错过了什么?

谢谢

Joh*_*man 6

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

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

因此,通过一些反思,我能够设置该属性,然后绑定到该项目。

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

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

我无法理解为什么 API 不允许您在新的 ItemId 对象上设置 ChangeKey。


Dan*_*iel 5

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

如果要在数据库中保存ID,则需要确保ID的列的排序规则区分大小写.我把我变成SQL_Latin1_General_Cp1_CI_ASSQL_Latin1_General_Cp1_CS_AS.CI不区分大小写且CS区分大小写.

您根本不必使用ChangeKey.

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

需要注意的一点是,链接中包含的内容是,移动时ID可能会发生变化.这是因为它们被复制到新位置并删除原始位置.