Dans ce billet, je vais expliquer comment utiliser les EWS (Exchange Web Services) via une application console C# classique afin d’effectuer des manipulations sur une BAL.
J’ai utilisé pour ce faire l’IDE Visual Studio 2010, et j’ai créé un nouveau projet C# de type « Console Application« .
Il faudra en premier lieu inclure les références suivantes :
using Microsoft.Exchange.WebServices; using Microsoft.Exchange.WebServices.Data;
Voici une liste de certaines fonctionnalités et expliquer comment les mettre en œuvre :
Se connecter à Exchange
La première chose à faire, est de se connecter au service Exchange afin de pouvoir utiliser les méthodes correspondantes. Il faut se connecter avec le compte lié à la boite au lettre que l’on veut exploiter pour que cela fonctionne.
ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2013); service.Credentials = new NetworkCredential(user.getUsername(), user.getPassword(), user.getDomainName()); service.AutodiscoverUrl(user.getMailAddress());
Remarque : mes méthodes user.getXXX() renvoient des strings
Lorsqu’on construit l’objet de type ExchangeService, il faut passer au constructeur la version d’Exchange. Pour ma part ça sera la version 2013, mais vous pouvez aussi utiliser les Web Services avec du 2010 ou du 2007.
Ensuite on va s’authentifier auprès d’Exchange, en renseignant l’attribut Credentials respectivement de notre nom d’utilisateur, mot de passe puis du nom de domaine utilisé (si votre nom de domaine est contoso.com, il faudra penser à ne renseigner que le préfixe contoso)
Et enfin, vous devez renseigner l’attribut Autodiscoverurl avec l’adresse mail correspondante, pour finaliser l’accès à la boite aux lettres.
Rechercher des mails dans la boîte aux lettres
Je vais maintenant vous montrer comment aller piocher des informations ou des éléments dans la boîte aux lettres à laquelle on s’est précédemment connecté. Commencez par déclarer un objet de type PropertySet en lui attribuant le type FirstClassProperties:
PropertySet itemPropertySet = new PropertySet(BasePropertySet.FirstClassProperties);
Ensuite, on va définir une vue, qui va limiter le nombre d’éléments à remonter. Ici j’ai mis int.MaxValue, qui représente la valeur max. d’un entier, soit environ 2 147 000 000. Mais vous pouvez en paramètre d’ItemView mettre le nombre désiré pour limiter les éléments qui vont êtres retournés.
ItemView view = new ItemView(int.MaxValue);
Ensuite je fixe les propriétés de la vue avec ce qu’on a précédemment déclaré :
view.PropertySet = itemPropertySet;
Puis on va définir un filtre, si on ne veut pas remonter en masse tout les emails. Sinon, il suffit de ne pas en créer.
SearchFilter filter = new SearchFilter.IsGreaterThanOrEqualTo(ItemSchema.DateTimeReceived, DateTime.Now.AddDays(-15));
Dans ce filtre de base, je ne vais remonter que les mails desquels le champ DateTimeReceived (date de réception du mail) sont égales ou supérieures à la date d’aujourd’hui moins 15 jours. Autrement dit, je ne cherche que les mails reçus dans les 15 derniers jours.
Maintenant, nous allons procéder à la recherche à proprement parler.
FindItemsResults<Item> findResults; findResults = service.FindItems(WellKnownFolderName.Inbox, filter, view);
findResults est donc la liste d’objet qui va contenir nos résultats. Dans la méthode FindItems on précise le répertoire virtuel (dossier de messagerie) dans lequel on veut rechercher les mails (WellKnowFolderName.Inbox est le nom de la Boîte de réception) , puis on précise le filtre de recherche et enfin le vue que l’on a créée.
Si vous n’avez pas de filtre, retirez simplement le deuxième argument.
Récupérer des éléments dans les mails
Faisons un peu de traitement maintenant. Admettons que je veux récupérer le corps, le sujet et les pièces jointes de tous les mails non-lus, puis de tagger ceux-ci en tant que lus. Voici comment je vais procéder :
FileAttachment[] attachedFiles = null; foreach (EmailMessage message in findResults.Items) { message.Load(); if (message.IsRead == false) { if (message.HasAttachments && message.Attachments[0] is FileAttachment) { int nbAttachments = message.Attachments.Count; attachedFiles = new FileAttachment[nbAttachments]; for (int i = 0; i < nbAttachments; i++) { message.Attachments[i].Load(); attachedFiles[i] = message.Attachments[i] as FileAttachment; } } string body = message.Body.Text; string subject = message.Subject; message.isRead() = true; } message.Update(new ConflictResolutionMode()); }
Les pièces jointes seront stockées (si il y’en a) dans le tableau de type FileAttachment. On va dans la boucle foreach commencer par appeler la méthode Load() car elle nécessaire sur l’objet dont on veut afficher ou récupérer un attribut/propriété. Si on ne fait pas ça, le comportement peut être assez aléatoire et on peut se retrouver avec des attributs vides. Juste derrière on teste avec message.isRead() si le message est non-lu, si c’est le cas on va commencer à récupérer nos informations.
Puis on vérifie si le message possède une ou plusieurs pièces jointes, si c’est le cas on va leur appliquer à chacun la méthode Load() habituelle, et les stocker dans notre tableau. Pour finir on affecte le texte du corps et le sujet dans des variables de type string. On tag ensuite le message actuel en tant que « lu« . Vous pouvez ensuite exploiter comme bon vous semble les pièces jointes, pour ma part je devais les enregistrer dans des éléments d’une liste SharePoint, mais vous pouvez également les enregistrer sur le disque dur local :
message.Attachments[i].Load("C:\\temp\\" + message.Attachments[i].Name);
Note : Ma méthode Update() permet de rendre les changements effectifs quand vous faites des opération autres que de la lecture.
Supprimer des mails
Rien de plus simple ! Rajoutez dans la boucle foreach, le test que vous voulez sur une propriété du mail, ou pas (si vous avez déjà filtré les mails que vous voulez supprimer avec le filtre de recherche en amont) puis faites cette opération :
message.Delete(new DeleteMode()); message.Update(new ConflictResolutionMode());
Note : Ma méthode Update() permet de rendre les changements effectifs quand vous faites des opération autres que de la lecture.