我在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()都是相同的。
我在这里缺少什么?
由于
答案 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超出我的范围。