En las empresas es muy común desarrollar aplicaciones que sean capaces de enviar correos electrónicos automáticamente. También son comunes las aplicaciones que se conectan a un buzón y descargan correos electrónicos para importarlos a otro sistema.
Comenzando con Microsoft Exchange 2010, ya no es posible utilizar WebDAV para acceder un servidor Exchange. Ahora el método preferido de comunicación con el servidor es por medio de los Servicios Web de Exchange (EWS), el cual fue introducido en Exchange 2007.
Al igual que WebDAV, EWS utiliza XML para la comunicación con Exchange. Pero a diferencia de WebDAV, EWS implementa el protocolo SOAP. Define el contrato del servicio en un documento WSDL.
Ya que EWS es un servicio web normal, podemos acceder Exchange desde cualquier plataforma. En .NET, simplemente añadirÃamos un referencia web al proyecto. Esto automáticamente generarÃa clases proxy que podremos usar para comunicarnos con EWS. Estas clases nos permitirán enviar correo, obtener correo, enviar invitaciones para juntas, manejar contactos, etc.
Desafortunadamente, aun con la ayuda de esta clases proxy, puede resultar complejo trabajar con EWS.
En .NET, hay una manera mas simple de acceder EWS que trabajar con el servicio web a través de clases proxy. Me refiero a Exchange Web Services Managed API. Esta API define clases .NET especificas para trabajar con EWS.
Podemos descargar EWS Managed API desde Centro de Descarga de Microsoft. La versión mas nueva al momento de este post es 1.1.
Después de instalar EWS Managed API, encontraras un nuevo directorio en una ubicación similar a C:\Archivos de Programa\Microsoft\Exchange\Web Services\1.1. En esta carpeta encontraras los archivos Microsoft.Exchange.WebServices.dll y Microsoft.Exchange.WebServices.xml. Solo copia estos archivos a un directorio de tu proyecto. Por lo general yo creo una carpeta llamada REF dentro del directorio del proyecto y ahà coloco todos los ensamblados que el proyecto va a referenciar.
No olvides referenciar Microsoft.Exchange.WebServices.dll en tu proyecto. También necesitaras importar el siguiente espacio de nombres en tu código.
using Microsoft.Exchange.WebServices.Data;
Antes de poder comenzar a interactuar con el servidor Exchange a través de EWS, necesitamos establecer una conexión. Para esto creamos una nueva instancia de la clase ExchangeService.
public static ExchangeService CrearConexion(String url) { // Conectar el callback del certificado para prevenir un error si Microsoft.NET no confia en el servidor ServicePointManager.ServerCertificateValidationCallback = delegate( Object obj, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors) { return true; }; ExchangeService service = new ExchangeService(); service.Url = new Uri(url); service.Credentials = new NetworkCredential("usuario", "password", "dominio"); return service; }
Este pequeño método toma la URL donde EWS esta localizado y retorna una nueva instancia de la clase ExchangeService.
Hay ocasiones en las que .NET arroja un error cuando no confÃa en el servidor porque no tenemos instalado un certificado. Una manera fácil de evitar esto es definir un delegado para el callback ServerCertificateValidationCallback que siempre retorna true.
Los Servicios Web de Exchange usualmente se encuentran en una URL en este formato:
http(s)://servidor/EWS/Exchange.asmx
O en este:
http(s)://autodiscover.dominio/EWS/Exchange.asmx
La clase ExchangeService no intentara conectarse al servidor Exchange hasta que llevemos a cabo la primer operación, como por ejemplo enviar o descargar correo electrónico.
Aquà esta una pequeña función para enviar un correo electrónico utilizando EWS Managed API y el método que definimos anteriormente.
private void EnviarEmail() { ExchangeService service = CrearConexion("https://autodiscover.test.com/EWS/Exchange.asmx"); EmailMessage msg = new EmailMessage(service); msg.ToRecipients.Add(new EmailAddress("oscar@test.com")); msg.Subject = "Test email"; msg.Body = new MessageBody(BodyType.HTML, "<p>Hola Email!</p>"); msg.Send(); }
La clase EmailMessage representa un correo electrónico. Necesitamos pasar una instancia de la clase ExchangeService a su constructor, ya que este ultimo es utilizado para la comunicación con el servidor Exchange.
En otros post veremos como llevar a cabo otras operaciones con Exchange EWS.