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 (introductionliste 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

Exchange 2010: MSExchangeTransport service not started

Today, my exchange setup just stopped working (I’m testing it, so it might have stopped a few days ago) I think it might be because of installation of patches on it.
Emails were stuck in the Transport Queue folder (I use EWS quite a lot, that’s where I found this info)

Anyway, I had those error messages while using Exchange troubleshooting:

An issue with the 'MSExchangeTransport' service on "ServerName" was found.
This service is required for local transport submission from the Mailbox server role on "ServerName and is currently not running or is experiencing backpressure.
When this service is not running or is experiencing backpressure, it may result in messages backing up in the outbox folder of each user's mailbox on "ServerName.
Please resolve these service issues and check whether messages can flow.
The value for the '\MSExchangeIS Mailbox\Messages Queued For Submission' counter on server "ServerName" is greater than zero (average value is 11) and it appears that 'MSExchangeMailSubmission' is failing to submit messages to at least one computer with the Hub Transport server role installed over the last minute.
'MSExchangeTransport' service on server "ServerName"1 is not running. It is important for this service to be running for the Mailbox server role on "ServerName" to submit messages to the Hub Transport server role on this computer.

Solution is just to start the Microsoft Exchange Transport service, you can find it here :

(in Server Manager>Configuration>Service)

DataBinding in C#: format a DateTime

Hi, today how to format a DateTime in a DataTable:

m_dtLogNotif is a DataTable
m_mfGridLogs is a DataGrid

BindingSource bsSource = new BindingSource();
m_mfGridLogs.BeginUpdate();
bsSource.DataSource = m_dtLogNotif;
m_mfGridLogs.DataSource = bsSource;
 
 DataGridViewCellStyle dgvcsStyle = m_mfGridLogs.Columns["Time"].DefaultCellStyle.Clone();
dgvcsStyle.Format = "dd/MM/yy HH:mm:ss";
m_mfGridLogs.Columns["Time"].DefaultCellStyle = dgvcsStyle;
 
m_mfGridLogs.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);
m_mfGridLogs.EndUpdate(true);