Estoy intentando obtener el número de correos electrónicos no leídos de Exchange para usuarios específicos.EWS obtiene el recuento de correos electrónicos no leídos de todas las carpetas
soy capaz de obtener el número de correos electrónicos de la bandeja de entrada de este modo:
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();
Esto funciona muy bien.
también soy capaz de obtener todas las subcarpetas es la bandeja de entrada:
FindFoldersResults findResults1 = service.FindFolders(
WellKnownFolderName.Inbox,
new FolderView(int.MaxValue) { Traversal = FolderTraversal.Deep });
foreach (Folder folder in findResults1.Folders)
{
Console.WriteLine(folder.DisplayName);
}
El problema es que no soy capaz de combinar estos dos juntos.
Sé que puedo hacer un ciclo foreach anidado, pero me gustaría evitar eso.
Encontré esta pregunta: Exchange Web Services (EWS) FindItems within All Folders, pero se requiere al menos usar Outlook 2010 para crear la carpeta AllItems
.
Sé que puedo crear SearchFilterCollection
, pero ¿cómo agregarle reglas para que busque correos electrónicos no leídos en Inbox y en todas las subcarpetas?
EDIT:
Esto lo que he tratado de hacer hasta ahora:
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;
}
Básicamente esto funciona, pero cuando he creado varias subcarpetas que empezó a funcionar muy lento.
¿En lugar de múltiples consultas puedo hacer una para obtener los mismos resultados?
código genial, pero incluye la carpeta de elementos eliminados al utilizar AllItems, lo que puede no ser ideal en todos los casos. – Zone12
@ Zone12 - Acabo de verificar y, en mi caso, la carpeta 'AllItems' no incluye elementos eliminados. No digo que esto esté en todos los servidores, ya que no soy un experto en Exchange. Tal vez haya una configuración suave en Exchange, ¿qué elementos debería incluir la carpeta 'AllItems'? – Misiu
¿Está obligado a crear instancias de '' SearchFilterCollection'' cuando coloca solo un '' SearchFilter'' en ellas? Esto parece excesivo. (Se aplica también a la pregunta original) – Chop