1

我创建了一个从外部源获取联系人对象的小型应用程序。然后,根据某些配置,我必须在我们的交换服务器上的用户联系人文件夹中创建/更新这些联系人,以便下次该用户打开其 MS Outlook 时,他会看到新联系人(在交换服务器上,我有具有模拟能力的用户,因此安全性不是问题)。

为此,我使用FindItems(folderId, filter, view)效果良好的 EWS 库的方法。对于过滤器,我使用的是用户的电子邮件地址,这是一个很好的键......如果我得到一个结果,这仅仅意味着联系人已经存在,我需要进行更新而不是创建。一切都按预期工作,直到这里......

但是,当GAL(全球地址列表)中已经存在联系人(实际上是电子邮件地址)时,我遇到了一个问题。在这种情况下,FindItems即使文件夹中存在联系人,该方法也不返回任何结果!似乎(这是一个假设)交换服务器为联系人创建了一个链接,这些联系人的电子邮件地址已经存在于 GAL 中,而不是新联系人。这可以解释为什么FindItems在这种情况下该方法不返回任何内容。奇怪的是,如果我要过滤另一个属性(例如名字和姓氏的组合),它会起作用!

目前,发生的情况是,对于GAL 中已经存在的每个联系人FindItems,都会进行创建而不是更新(因为该方法不返回任何内容),因此会创建 X 次相同的联系人(而不是创建一次,然后更新 X-1 次)。

问题当然是,当联系人已经存在于 GAL 中时,我怎么知道它是否存在于交换文件夹中?

当前代码:

ItemView view = new ItemView(5)
{
   PropertySet = new PropertySet(BasePropertySet.FirstClassProperties)
};
SearchFilter f = new SearchFilter.IsEqualTo(ContactSchema.EmailAddress1, email);
FindItemsResults<Item> contactItems = _service.FindItems(folderId, f, view);
int resultCount = contactItems.Count(); // Always 0 if GAL, otherwise it works
4

1 回答 1

0

最后,我通过使用该SetExtendedProperty方法解决了扩展属性的问题。在这个扩展的领域,我只是放了一个Id并且解决了这个问题。

但这并不能解释为什么搜索无法使用电子邮件地址......如果有人知道答案,我仍然感兴趣:)

新搜索如下所示:

ItemView view = new ItemView(nb);
view.PropertySet = new PropertySet(BasePropertySet.FirstClassProperties, _extendedPropDef);
SearchFilter f = new SearchFilter.IsEqualTo(_extendedPropDef, contact.Id);
FindItemsResults<Item> contactItems = _service.FindItems(folderId, f, view);

使用此代码,一切都按预期工作......

于 2013-10-01T09:31:32.327 回答