Microsoft Exchange – EWS: FindItems et récupération d’emails

Commençons par une fonction basique qui permettra de tester l’installation et la bonne configuration de votre service : La récupération d’email.

Introduction

La récupération des emails se fait en 2 temps généralement. D’abord nous avons le FindItems qui permet de renvoyer les objets correspondants à la requête. Ensuite il est possible d’appeler une 2ème méthode pour charger des propriétés spéciales, qui ne sont pas récupérées par défaut, dans les emails préalablement récupérés.

Exemple

ItemView itemView = new ItemView(iElementNb);
 
itemView.OrderBy.Add(EmailMessageSchema.DateTimeReceived, SortDirection.Descending);
 
FindItemsResults findResults = m_service.FindItems(WellKnownFolderName.Inbox, itemView);
 
//Ici, on récupère le MIME content (qui n'est pas chargé par le simple appel à la méthode FindItems)
 
PropertySet ps = new PropertySet();
 
ps.Add(ItemSchema.MimeContent);
 
m_service.LoadPropertiesForItems(findResults, ps);

L’objet ItemView permet de spécifier le nombre d’éléments à récupérer ainsi que l’ordre dans lequel ils seront retournés

La méthode FindItems possède plusieurs prototypes :

Il est possible de spécifier le dossier de recherche via son FolderID (nous y reviendrons un peu plus loin) afin de pouvoir parcourir des dossiers autres que ceux basiques (les « WellKnownFolderName »)

Il est aussi possible d’ajouter un critère de recherche, afin de récupérer seulement les emails ayant pour envoyeur Mr X, ou ceux envoyé à une date donnée…

Exemple

Récupération de tous les emails situés dans la boite de réception contenant le motif X(appelé ici sTextPattern) dans le sujet ou dans le corps de l’email

ItemView itemView = new ItemView(iElementNb);
 
itemView.OrderBy.Add(EmailMessageSchema.DateTimeReceived, SortDirection.Descending);
 
SearchFilter.SearchFilterCollection searchFilterCollection =
 
new SearchFilter.SearchFilterCollection(LogicalOperator.Or);
 
searchFilterCollection.Add(new SearchFilter.ContainsSubstring(ItemSchema.Body, sTextPattern));
 
searchFilterCollection.Add(new SearchFilter.ContainsSubstring(ItemSchema.Subject, sTextPattern));
 
findResults = m_service.FindItems(WellKnownFolderName.Inbox, searchFilterCollection, itemView);

Mise à jour:

Seulement voila, le fait d’utiliser FindItems avec un SearchFilterCollection (ou SearchFilter) créer une indexation des résultats de recherches sur le serveur Exchange. En gros, les prochaines recherches exactement similaires seront bien plus rapides, mais l’indexation fait perdre des perfs et prends de la place sur le serveur Exchange.

Pour éviter cela, il est possible d’utiliser une autre sémantique qui est la recherche Exchange Search. Pour cela, il faut utiliser les mots clés d’Advanced Query Syntax (introduction, liste de mots clés)

Le seul exemple que je donnerai ici sera l’utilisation de la propriété System.FullText qui permet de récupérer tous les emails contenant un certain motif dans:

Le corps, le titre, le contenu des pièces jointes (test sur un .txt), le nom des pièces jointes etc

À utiliser simplement comme cela:

string sRequest = "System.FullText:" + sMotifARechercher;
findResults = m_service.FindItems(WellKnownFolderName.Inbox, sRequest, itemView);

Source additionnelle: http://msdn.microsoft.com/en-us/library/hh148195(v=EXCHG.140).aspx

Voir Chapitre suivant : Ecrire et envoyer un email avec EWS API managed