En ocasiones es posible que necesitemos acceder a un buzón de Microsoft Exchange de forma programática. Para ello Exchange ofrece varias APIs en sus diferentes versiones. Las versiones antiguas de Exchange ofrecían APIs bastante potentes aunque algo engorrosas y dificiles de utilizar como se puede ver en esta serie de artículos:
Recientemente se ha publicado la
Exchange Web Services Managed API 1.1 Esta es una API manejada, basada en los Exchange Web Services (EWS), muy intuitiva y más sencilla de utilizar que sus predecesoras. Además es posible usar esta API para acceder a servidores Exchange 2010 o 2007 SP1.
En el siguiente ejemplo podemos ver como se accedería a los primeros 10 mensajes de la bandeja de entrada (inbox) de nuestro buzón, cuyo asunto sea "Test", ordenado por fecha y mostraremos el "sender" de dichos mensajes:
1. Desde Visual Studio 2010 creamos una referencia a Microsoft.Exchange.WebServices.dll y hacemos un using de:
using System.Web;
using Microsoft.Exchange.WebServices.Data;
2. Nos conectamos a Exchange (por defecto usando las credenciales del usuario con el que estamos logados):
ExchangeService service = new ExchangeService();
//Tambien podríamos especificar unas credenciales de forma explícita
//service.Credentials = new NetworkCredential("username", "password", "domain");
3. Hacemos un Autodiscover para establecer el endpoint del servicio EWS usando nuestra cuenta de correo:
service.AutodiscoverUrl(
usuario@dominio);
//Tambien se podría hacer manualmente si conocemos la url del servicio EWS
//service.Url = new Uri("urldenuestroservicioEWS");
4. Formamos nuestra consulta:
ItemView view = new ItemView(10);
view.OrderBy.Add(ItemSchema.DateTimeReceived, SortDirection.Ascending);
view.PropertySet = new PropertySet(
BasePropertySet.IdOnly,
ItemSchema.Subject,
ItemSchema.DateTimeReceived);
5. Ejecutamos la consulta:
FindItemsResults<Item> findResults = service.FindItems(
WellKnownFolderName.Inbox,
new SearchFilter.SearchFilterCollection(
new SearchFilter.ContainsSubstring(ItemSchema.Subject, "Test")),
view);
6. Mostramos los resultados:
Console.WriteLine("Total number of items found: " + findResults.TotalCount.ToString());
foreach (Item item in findResults.Items )
{
EmailMessage message = EmailMessage.Bind(service, item.Id );
Console.WriteLine(message.Sender.Name);
}
Enlaces relacionados: