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

时间:2012-10-25 21:59:13

标签: c# email exchange-server

我在C#中使用Exchange托管API来访问Exchange 2010中的数据。我正在尝试返回返回的电子邮件项的唯一标识符,以便以后可以在单独的调用中通过该ID检索它们(即, call返回所有邮件项,然后第二次调用以检索单个项目以将其标记为已读,等等。我遇到的问题是,作为每个邮件项的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()都是相同的。

我在这里缺少什么?

由于

2 个答案:

答案 0 :(得分:5)

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

如果要在数据库中保存ID,则需要确保ID的列的排序规则区分大小写。我将我从SQL_Latin1_General_Cp1_CI_AS更改为SQL_Latin1_General_Cp1_CS_AS。 CI不区分大小写且CS区分大小写。

您根本不必使用ChangeKey。

有关详细信息,请参阅EWS Identifiers in Exchange

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

答案 1 :(得分:4)

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

但是,在Managed 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);

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

为什么API不允许你在新的ItemId对象上设置ChangeKey超出我的范围。