1

外部ソースから連絡先オブジェクトを取得する小さなアプリケーションを作成しました。次に、いくつかの構成に応じて、Exchange サーバー上のユーザーの連絡先フォルダーにこれらの連絡先を作成/更新する必要があります。これにより、このユーザーが次に MS Outlook を開いたときに、新しい連絡先が表示されます (Exchange サーバー上で、私が持っているなりすまし機能を持つユーザーであるため、セキュリティは問題になりません)。

そのために、FindItems(folderId, filter, view)うまく機能する EWS ライブラリのメソッドを使用します。フィルターには、非常に優れたキーであるユーザーの電子メールアドレスを使用しています...結果が返された場合、これは単に連絡先が既に存在し、作成ではなく更新を行う必要があることを意味します. ここまですべてが期待どおりに機能します...

しかし、連絡先(実際には電子メール アドレス) が GAL (グローバル アドレス リスト) に既に存在する場合、問題が発生します。この場合、連絡先がフォルダーに存在するFindItems場合でも、メソッドは結果を返しません。Exchange サーバーは、新しい連絡先ではなく、GAL に既に存在する電子メール アドレスを持つ連絡先のリンクを作成しているようです (これは仮定です)。これは、この場合にメソッドが何も返さない理由を説明できます。奇妙なことに、別のプロパティ (たとえば、名と姓の組み合わせ) でフィルタリングすると、うまくいきます!FindItems

現在、GAL に既に存在する連絡先ごとに、更新ではなく作成が行われ (FindItemsメソッドが何も返さないため)、その結果、同じ連絡先が X 回作成されます (一度作成されるのではなく) 。 、次に更新された X-1 時間)。

問題はもちろん、連絡先が既に GAL に存在する場合に、その連絡先が Exchange フォルダーに存在するかどうかを知るにはどうすればよいかということです。

現在のコード:

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、問題を解決する and を配置しました。

しかし、それはなぜメールアドレスで検索が機能しないのかを説明していません...誰かが答えを知っていれば、私はまだ興味があります:)

新しい検索は次のようになります。

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 に答える