外部ソースから連絡先オブジェクトを取得する小さなアプリケーションを作成しました。次に、いくつかの構成に応じて、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