EWS erhält die Anzahl der ungelesenen E-Mails aus allen Ordnern
Ich versuche, die Anzahl der ungelesenen E-Mails von Exchange für einen bestimmten Benutzer abzurufen.
Ich kann die folgende Anzahl von E-Mails aus dem Posteingang abrufen:
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();
Das funktioniert super.
Ich kann auch alle Unterordner im Posteingang bekommen:
FindFoldersResults findResults1 = service.FindFolders(
WellKnownFolderName.Inbox,
new FolderView(int.MaxValue) { Traversal = FolderTraversal.Deep });
foreach (Folder folder in findResults1.Folders)
{
Console.WriteLine(folder.DisplayName);
}
Das Problem ist, dass ich diese beiden nicht miteinander kombinieren kann.
Ich weiß, dass ich verschachtelte foreach-Schleifen ausführen kann, aber das möchte ich vermeiden.
Ich habe diese Frage gefunden:FindItems für Exchange-Webdienste (EWS) in allen OrdnernZum Erstellen muss jedoch mindestens Outlook 2010 verwendet werdenAllItems
Mappe.
Ich weiß, dass ich schaffen kannSearchFilterCollection
, aber wie füge ich Regeln hinzu, damit im Posteingang und in allen Unterordnern nach ungelesenen E-Mails gesucht wird?
BEARBEITEN:
Das habe ich bisher versucht:
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;
}
Grundsätzlich funktioniert dies, aber wenn ich mehrere Unterordner erstellt habe, begann es sehr langsam zu arbeiten.
Kann ich anstelle mehrerer Abfragen eine Abfrage durchführen, um dieselben Ergebnisse zu erzielen?