viernes, 21 de octubre de 2011

Exchange Server WebService

Bueno amigos, mil gracias por seguirme, la verdad es que he estado perdido durante mucho tiempo por temas de trabajo, pero bueno como dicen, hay que darle hasta que duela.

Esta vez subire codigo asociado a Exchange Service WebService probado en las versiones 2007 SP1 y y 2010. La informacion asociada a este tema la pueden encontrar aqui

Normalmente, existen diversas formas y ejemplos de como trabajar con Exchange a travez de Microsoft Outlook, pero que pasa cuando queremos que multiples usuarios trabajen con sus respectivas cuentas de Exchange. Bueno la solucion es muy simple, podemos habilitar y usar los servicios de Exchange Webservices para esto.

En los siguientes ejemplos veremos como poder habilitar y crear una conexion valida con Exchange WebService, como enviar correos asi como tambien crear citas y contactos, adicionalmente puedo decir que con este servicio podriamos usuar casi todos los mecanismos que exchange ofrece para administrar una cuenta de e-mail por codigo.

Lo primero es lo primero, existen dos formas de conectarse usuando usuarios o por suplantacion, el problema de usar usuarios es que deben tener todas las cuentas y claves del servicio por lo cual, y siempre cuando se pueda, usar las claves de red que el sistema entrega.

Aqui entrego las tres posibles formas de conexion, pero para que todo funcione como debe ser, primero debemos sobreescribir un servicio, solo en el caso de que les aparezca un error de conexion.

System.Net.ServicePointManager.ServerCertificateValidationCallback = Function(obj As Object, certificate As X509Certificate, chain As X509Chain, errors As SslPolicyErrors) True

En el caso de que lo desearamos podriamos definir en que version deseamos trabajar, para ello debemos usar las siguientes lineas de codigo.

Dim version As ExchangeVersion = ExchangeVersion.Exchange2007_SP1
Dim service As ExchangeService = New ExchangeService(version)

este codigo evitara cualquier posible problema de conexion, pero deben tener mucho cuidado porque no todos los certificados de seguridad retornan un valor boolean True.

Realizado este paso podremos continuar con la conexion, existen tres claras formas las cuales se pueden realizar de la siguiente forma:

Si estan trabajando en entornos Web:
service.Credentials = New WebCredentials("Usuario", "Clave", "Dominio")

Si estan trabajando en un entorno de red de trabajo:
service.Credentials = New NetworkCredential("Usuario", "Clave", "Dominio")

Ahora en el caso de que se pueda hacer, es decir que existe compatibilidad entre los usuarios de la red de trabajo y los usuarios del servidor de exchange, se puede usar la siguiente linea de codigo:
service.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials

Lo siguiente es definir sobre que servidor deben trabajar, para ello deben definir las siguientes lineas de codigo
service.Url = New Uri("http://Nombre de Servidor/ews/exchange.asmx")

Aunque normalmente se trabaja sobre un servidor con el servicio SSL habilitado por lo cual se debe usar https
service.Url = New Uri("https://Nombre de Servidor/ews/exchange.asmx")

Con esto podremos decir que ya estariamos listos para enviar un email, esta es la primera prueba, si la pasan es que su servidor de Exchange OWA tiene bien configurado Exchange Server WebService. Para hacer esto me di mil vueltas asi que las lineas de codigo que estoy dejando aquí son validas.

Para enviar un correo pueden utilizar las siguientes lineas de código.

Dim message As EmailMessage = New EmailMessage(service)
message.Subject = "Esto es una prueba"
message.Body = "Prueba de EWS Managed API."
message.ToRecipients.Add("usuario@dominio.extension")
message.SendAndSaveCopy()

Hasta aqui, si al ejecutar la prueba les salta un error, pueden existir cosas que han olvidado hacer, la primera es que no han sobrescrito la respuesta al metodo System.Net.ServicePointManager.ServerCertificateValidationCallback descrito al inicio del Post o la segunda es que no esta configurado el servicio. Peor aun puede ser que el mecanismo de conexion para el servicio no sea valido, en tal caso deben ponerse en contacto con el administrador del servico.

Existen mecanismos para buscar y listar, leer, modificar o borrar correos, los cuales pueden encontrar en el MSDN, yo me he tenido que consentrar en otras dos opciones Citas y Contactos, por lo cual continuo con estos temas, pero dejenme decirles que los mecanismos son muy similares solo cambian las instancias de llamadas a los objetos

Administracion de Citas(Appointment).

CREAR CITAS

Para crear una nueva cita debemos utiliar el Objeto Appointment, aqui va el ejemplo:

Dim appt As Appointment = New Appointment(service)
With appt
.Subject = "Subject"
.Body = "Body"
.StartTimeZone = TimeZoneInfo.Local
.Start = fecha del tipo DateTime
.ReminderMinutesBeforeStart = 15
.End = fecha del tipo DateTime
.Body.BodyType = BodyType.Text
.RequiredAttendees.Add("email1")
.RequiredAttendees.Add("email2")
.Save()
End With

Con esto ya hemos creado una Cita con participantes, bueno el siguiente paso sera leer la cita, para ello debemos hacer lo siguiente>

LEER LISTA DE CITAS

Explicare un poco el proceso de lo que hago, creo un Datatabe y en este inserto los registros de las citas que se han definido el un periodo de fechas determinado, para ello he hecho lo siguiente;

Dim oCalendar As New CalendarView(FIcinio en formato DateTime, FFin en DateTime)
Dim findResults As FindItemsResults(Of Appointment) = service.FindAppointments(WellKnownFolderName.Calendar, oCalendar)
Dim items As New List(Of Item)()
For Each appointment As Appointment In findResults
items.Add(appointment)
Next

service.LoadPropertiesForItems(items, PropertySet.FirstClassProperties)

' aqui creamos el data table con sus columnas para el resultado
Dim dt As New DataTable
With dt
.Columns.Add("id", System.Type.GetType("System.String"))
.Columns.Add("Subject", System.Type.GetType("System.String"))
.Columns.Add("Body", System.Type.GetType("System.String"))
.Columns.Add("StartTimeZone", System.Type.GetType("System.String"))
.Columns.Add("Start", System.Type.GetType("System.String"))
.Columns.Add("ReminderMinutesBeforeStart", System.Type.GetType("System.String"))
.Columns.Add("End", System.Type.GetType("System.String"))
End With

' ahora cargamos la informacion de los appointment al datatable
For Each item As Item In items
Dim dr As DataRow = dt.NewRow
dr("id") = item.Id.UniqueId
dr("Subject") = item.Subject.ToString()
dr("Body") = DirectCast(item,Appointment).Body.ToString()
dr("StartTimeZone") = DirectCast(item, Appointment).StartTimeZone
dr("Start") = DirectCast(item, Appointment).Start
dr("ReminderMinutesBeforeStart") = item.ReminderMinutesBeforeStart
dr("End") = DirectCast(item, Appointment).End
dt.Rows.Add(dr)
Next

Bueno amigos, con esto el resultado lo pueden cargar a un objeto de lista de deseen para utilizarlo, ahora ya tenemos los identificadores del item de tipo cita y podremos buscarlos para modificarlos, esto se hace de la siguiente forma:

MODIFICACION DE CITAS

Recuerden que el identificador del item lo hemos encontrado a traves de la lista que hemos seleccionado del datatable creado en la seccion listar Appointment

Dim oAppointment As Appointment = Appointment.Bind(service, New ItemId("Id Item"))
oAppointment.Subject = "Subject"
oAppointment.StartTimeZone = TimeZoneInfo.Local
oAppointment.Start = fecha formato Datetime
oAppointment.ReminderMinutesBeforeStart = 15
oAppointment.End = fecha formato Datetime
oAppointment.Body.BodyType = BodyType.Text
oAppointment.Body.Text = "Body"
oAppointment.Update(ConflictResolutionMode.AlwaysOverwrite)

Como ven es muy simple y no requiere demasiado, por lo cual ahora les doy las lineas de codigo para borrar un item.

Borrar Item Cita (Appointment)

Esto requiere solo dos cosas, la creacion y busqueda del item y la opcion de borrado, para ello debemos utilizar lo siguiente:

Dim oAppointment As Appointment = Appointment.Bind(service, New ItemId(idxItem)) oAppointment.Delete(DeleteMode.HardDelete)

NOTA: Bueno amigos esta misma metodologia de trabajo la pueden usuar para administrar Correor, Contactos, Citas y .... Mas info ver en MSDN

Para buscar contactos deben usar las siguientes lineas de codigo:

Esta linea de codigo trae los ultimos 100 contactos que se han creado, dependiendo del numero esto puede aumentarse o redicirse

Dim findResults As FindItemsResults(Of Item) = service.FindItems(WellKnownFolderName.Contacts, New ItemView(100))

Dim items As New List(Of Item)()
For Each itemContact As Contact In findResults
items.Add(itemContact)
Next

service.LoadPropertiesForItems(items, PropertySet.FirstClassProperties)

y para operar sobre un contacto deben crear un objeto de tipo Contact, como se define a continuacion:

Dim oContact As Contact = Contact.Bind(service, New ItemId(idxItem))

los metodos para borrar o modificar son los mismos que en Appointment, es decir:

oContact.Delete(DeleteMode.HardDelete)

oContact.Update(ConflictResolutionMode.AlwaysOverwrite)

En la seccion de server.FindItems pueden tambien definir criterios de busqueda, esta informacion la pueden encontrar en la documentacion de Exchange Server WebService.

Saludos y espero que esta info sea de ayuda.

No hay comentarios: