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

Introduction à Exchange EWS API

Aujourd’hui je vais expliquer brièvement les deux manières les plus communes afin d’interagir avec son serveur Exchange. Grâce à cela, nous pourrons ensuite effectuer des opérations du type réception et envoi d’email et bien plus encore…

Mais commençons par le début :

Partie I: Configuration et initialisation de la connexion avec le serveur Exchange

Introduction

Il y a plusieurs façons de se connecter et de communiquer avec le serveur Exchange, du plus simple (en utilisant la nouvelle API conçu récemment par Microsoft) jusqu’au plus compliqué (envoyer des requêtes XML/ SOAP).  Dans cet article je parlerai uniquement de l’API managée et du Webservice EWS offert par le serveur Exchange

Utilisation de l’API EWS Managed 1.1

Etape 0 : Que fait cette API ?

Elle permet de rendre plus facile l’utilisation des services offerts par le serveur exchange en encapsulant les fonctionnalités dans des méthodes bien pensées.

Etape 1 : Téléchargement de l’API

La DLL dont nous avons besoin (Microsoft.Exchange.WebServices.dll) se place par défaut dans le dossier C:\Program Files\Microsoft\Exchange\Web Services\1.1\

Etape 2 : Création d’un projet C# et ajout de la référence

Ouvrir Visual Studio, créer un nouveau projet Windows Forms Application et ajouter cette DLL dans références.

Etape 3 : Code basique nécessaire à l’initialisation du service

Copier ce qui suit dans votre code :

using Microsoft.Exchange.WebServices.Data; //Permet d'utiliser les fonctionnalités de l'API

Et ce qui suit dans le corps d’une méthode :

ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2010_SP1);
m_service.Credentials = new WebCredentials(sUser, sPwd, sDomain);
m_service.Url = new Uri("https://SERVER/EWS/Exchange.asmx");

Dans le cas d’une où le certificat de sécurité n’est pas signé, vous pourriez voir vos requêtes refusées, dans ce cas ajoutez ceci :

using System.Security.Cryptography.X509Certificates;
private static bool RemoteCertificateValidationCallback(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors){      return true;}

Et ce qui suit dans votre code :

ServicePointManager.ServerCertificateValidationCallback = RemoteCertificateValidationCallback;

Voilà, votre service est prêt à être utiliser. Voir chapitre suivant

Utilisation directe du Web Service EWS

L’utilisation du web service n’est pas conseillée par Microsoft, même si elle fournit quelques fonctionnalités poussées supplémentaires (pour le moment) par rapport à l’API(ExportItem par exemple, j’y reviendrais dans un prochain article)

Etape 1 : Création d’un projet C# et ajout de la web référence

Ouvrir Visual Studio, créer un nouveau projet Windows Form Application et ajouter dans une référence à un service. Taper ensuite l’adresse de votre service (https://SERVER/EWS/Exchange.asmx) et rechercher le service. Ajouter le  en spécifiant un namespace approprié (ici, je le nomme ExchangeWebRef)

Etape 2 : Code basique nécessaire à l’initialisation du service

using TestExchangeBasicFeatures.ExchangeWebRef;
//Connection directement avec le webservice:
m_exchangeServerBinding = new ExchangeServiceBinding();
ICredentials creds = new NetworkCredential(sUser, sPwd, sDomain);
m_exchangeServerBinding.Credentials = creds;
m_exchangeServerBinding.Url = @"https://SERVER/EWS/Exchange.asmx";
m_exchangeServerBinding.RequestServerVersionValue = new RequestServerVersion();
m_exchangeServerBinding.RequestServerVersionValue.Version = ExchangeVersionType.Exchange2010_SP1;

Voilà, votre WebService est prêt à être utilisé. Voir chapitre suivant

FAQ

Question : Dans le cas de l’utilisation du Web Service, je ne parviens pas à trouver la classe ExchangeServiceBinding dans la référence de service que j’ai ajouté.

Réponse : Ajouter le web service en passant par avancé>ajouter une référence web