特定のユーザーの未読メールの数を Exchange から取得しようとしています。
次のように、受信トレイからメールの数を取得できます。
SearchFilter sf = new SearchFilter.SearchFilterCollection(LogicalOperator.And, new SearchFilter.IsEqualTo(EmailMessageSchema.IsRead, false));
ItemView view = new ItemView(int.MaxValue);
FindItemsResults<Item> findResults = service.FindItems(WellKnownFolderName.Inbox, sf, view);
int unreadCount = 0;
foreach (EmailMessage i in findResults)
{
unreadCount++;
}
label1.Text = unreadCount.ToString();
これはうまくいきます。
すべてのサブフォルダーを受信トレイにすることもできます。
FindFoldersResults findResults1 = service.FindFolders(
WellKnownFolderName.Inbox,
new FolderView(int.MaxValue) { Traversal = FolderTraversal.Deep });
foreach (Folder folder in findResults1.Folders)
{
Console.WriteLine(folder.DisplayName);
}
問題は、これら 2 つを組み合わせることができないことです。
ネストされた foreach ループを実行できることはわかっていますが、それは避けたいと思います。
次の質問を見つけました: Exchange Web Services (EWS) FindItems within All Foldersですが、フォルダーを作成するには、少なくとも Outlook 2010 を使用する必要がありAllItems
ます。
を作成できることはわかっていますSearchFilterCollection
が、ルールを追加して、受信トレイとすべてのサブフォルダーで未読のメールを検索する方法を教えてください。
編集:
これは私がこれまでにやろうとしたことです:
private int getEmailCount()
{
int unreadCount = 0;
FolderView viewFolders = new FolderView(int.MaxValue) { Traversal = FolderTraversal.Deep, PropertySet = new PropertySet(BasePropertySet.IdOnly) };
ItemView viewEmails = new ItemView(int.MaxValue) { PropertySet = new PropertySet(BasePropertySet.IdOnly) };
SearchFilter unreadFilter = new SearchFilter.SearchFilterCollection(LogicalOperator.And, new SearchFilter.IsEqualTo(EmailMessageSchema.IsRead, false));
FindItemsResults<Item> findResults = service.FindItems(WellKnownFolderName.Inbox, unreadFilter, viewEmails);
unreadCount += findResults.Count();
FindFoldersResults inboxFolders = service.FindFolders(WellKnownFolderName.Inbox, viewFolders);
foreach (Folder folder in inboxFolders.Folders)
{
findResults = service.FindItems(folder.Id, unreadFilter, viewEmails);
unreadCount += findResults.Count();
}
return unreadCount;
}
基本的にこれは機能しますが、複数のサブフォルダーを作成すると、動作が非常に遅くなりました。
複数のクエリの代わりに、同じ結果を得るために 1 つのクエリを実行できますか?