4

C#でExchange Managed APIを使用して、Exchange 2010からのデータにアクセスしています。返された電子メールアイテムの一意の識別子を返そうとしているので、後で別の呼び出しでそのIDで取得できます(つまり、最初の呼び出しですべてが返されます)アイテムをメールで送信してから、2回目の呼び出しで個々のアイテムを取得し、既読としてマークします。私が遭遇している問題は、各メールアイテムの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()は同じです。

ここで何が欠けていますか?

ありがとう

4

2 に答える 2

6

もう少し掘り下げてみると、特定のメールアイテムの一意の識別子を取得するには、IdのUniqueIdプロパティとChangeKeyプロパティの両方が必要であるように見えます。Exchange Webサービスを使用する場合は、両方が必要です。

ただし、マネージAPIでは、ItemIdオブジェクトを作成すると、UniqueIdプロパティのみを受け入れ、ChangeKeyプロパティのセッターを提供しません。

少し考えてみると、そのプロパティを設定してから、そのアイテムにバインドすることができました。

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」の組み合わせは複製されませんでした(メールアイテムを複製した場合でも、2つの個別のアイテムのChangeKey値は異なります)。

APIが新しいItemIdオブジェクトにChangeKeyを設定できない理由は私にはわかりません。

于 2012-10-26T19:16:40.847 に答える
6

固有 ID は、EWS アイテムに固有です。同じ問題を抱えていると思ったので、この質問に出くわしました。大文字と小文字が区別されるだけであることがわかりました。

ID をデータベースに保存する場合は、ID の列の照合で大文字と小文字が区別されるようにする必要があります。から に変更しSQL_Latin1_General_Cp1_CI_ASましたSQL_Latin1_General_Cp1_CS_AS。CI では大文字と小文字が区別されず、CS では大文字と小文字が区別されます。

ChangeKey を使用する必要はまったくありません。

詳細については、Exchange の EWS 識別子を参照してください。

リンクで説明されている 1 つの注意点は、移動すると ID が変わる可能性があることです。これは、それらが新しい場所にコピーされ、オリジナルが削除されるためです。

于 2015-07-18T18:36:16.223 に答える