EWS obtenir nombre de courriels non lus de tous les dossiers
Je vais essayer d'obtenir le nombre d'e-mails non lus à partir d'Exchange pour un utilisateur spécifique.
Je suis en mesure d'obtenir le nombre d'e-mails à partir de la Boîte de réception comme suit:
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();
Cela fonctionne très bien.
Je suis également en mesure d'obtenir tous les sous-dossiers de la Boîte de réception:
FindFoldersResults findResults1 = service.FindFolders(
WellKnownFolderName.Inbox,
new FolderView(int.MaxValue) { Traversal = FolderTraversal.Deep });
foreach (Folder folder in findResults1.Folders)
{
Console.WriteLine(folder.DisplayName);
}
Problème est que je ne suis pas capable de combiner ces deux ensemble.
Je sais que je peux faire imbriquée boucle foreach, mais je voudrais l'éviter.
J'ai trouvé ces question: Exchange Web Services (EWS) FindItems dans Tous les Dossiers, mais il nécessite d'au moins utiliser Outlook 2010 dans le but de créer AllItems
dossier.
Je sais que je peux créer SearchFilterCollection
, mais comment faire pour ajouter des règles pour qu'il sera à la recherche d'e-mails non lus dans la Boîte de réception et tous les sous-dossiers?
EDIT:
Ce que j'ai essayé de faire jusqu'à présent:
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;
}
En gros, cela fonctionne, mais lorsque j'ai créé plusieurs sous-dossiers qu'il a commencé à travailler très lent.
Au lieu de plusieurs requêtes puis-je faire un pour obtenir les mêmes résultats?
OriginalL'auteur Misiu | 2012-10-02
Vous devez vous connecter pour publier un commentaire.
J'ai cherché un peu et a créé à cette fonction:
Fondamentalement, il vérifie si nous avons
AllItems
dossier disponible.Si
YES
puis nous en faire une simple requête qui retourne tous les messages non lus.Si
NO
puis on boucle tous les dossiers à l'intérieur de la Boîte de réception. C'est plus lent et dépend du nombre de dossiers et les niveaux nous avons.Toutes les corrections et améliorations sont les bienvenues 🙂
Je viens de vérifier dans mon cas
AllItems
dossier ne comprend pas les éléments supprimés. Je ne dis pas que c'est sur tous les serveur que je ne suis pas un Échange d'experts. Peut-être il ya un certain soft de configuration Exchange quels éléments devraientAllItems
dossier?Etes-vous obligé de créer
SearchFilterCollection
cas, lorsque vous mettez une seuleSearchFilter
? Cela semble exagéré. (S'applique à la question de départ).Je n'étais pas obligé de créer
SearchFilterCollection
. Je n'ai même pas remarqué cela, alors merci pour le tuyau. Je n'ai pas de problèmes de performances avec mon code, mais la suppression de la Collecte et de la laisser seul filtre semble la meilleure option pour l'amélioration. Dans un avenir proche je vais être en mesure d'expérimenter avec Exchange 2013, donc je vais définitivement seront à la recherche dans ce code. Vous avez peut être la meilleure solution pour cela? Si Oui, merci de post est une réponse.OriginalL'auteur Misiu
Pas sûr que c'est ce que vous cherchez, mais...
Obtenir des e-mails non lus nombre d'boîte de réception /projet de etc.):
Dans ce cas, le service est appelé à deux reprises, mais les appels sont émis de façon séquentielle - pas assez bon.
Cependant, vous pouvez à la fois les demandes en même temps et augmenter le temps de réponse de votre application.
Voir cette ou tout tutoriel qui explique comment instancier deux TPL tâches, de les envoyer à la planificateur de tâches, attendre pour les deux (WaitAll()) à compléter et, en fin de compte, accéder à leurs résultats 🙂
Et, si vous voulez obtenir l'e-mail compte après l'application de certains filtres personnalisés (non triviaux 'non lu' filtre), puis assurez-vous que votre ItemView objet est ItemView(1), pas ItemView(int.MaxValue). Ensuite, obtenir le total count:
Voir le documents pour la propriété TotalCount.
De cette façon, la réponse du service est assez petit - il contient un seul élément, mais elle (la réponse) porte également le nombre total... Qu'est ce que vous voulez, non?
OriginalL'auteur turdus-merula
Voici le code pour récupérer le total non lus compter d'une boîte aux lettres.
displayname (forinformational but)
bien gérer ce cas
Limites avec cet extrait de code:
Cela ne fait qu'une seule findfolders appel et de travailler sur les résultats.
OriginalL'auteur Sesha Krishnan
Exemple de Code pour récupérer des dossiers et de leur compte. Dans cet exemple, nous sommes liste de tous de premier niveau des dossiers, et de les ajouter à une classe commune liste des dossiers, avec un NewMessageCount objet. La clé est le Dossier.Bind(myService, dossier.Id).UnreadCount section.
OriginalL'auteur Woody85