sp2 software services microsoft kit exchange ews development c# asp.net web-services exchange-server-2007 ews-managed-api

c# - software - Extraiga las citas de calendario público de Exchange 2007 con la API de servicios web de Exchange



install exchange web services (2)

Como prometí aquí, hay un ejemplo de código. Utilicé la API administrada 1.0 de los servicios web de Microsoft Exchange (EWS) y le recomiendo que haga lo mismo. La mayoría de los comentarios que incluí en el código

using System; using Microsoft.Exchange.WebServices.Data; using System.Net; namespace ExchangePublicFolders { class Program { static FolderId FindPublicFolder (ExchangeService myService, FolderId baseFolderId, string folderName) { // We will search using paging. We will use page size 10 FolderView folderView = new FolderView (10,0); folderView.OffsetBasePoint = OffsetBasePoint.Beginning; // we will need only DisplayName and Id of every folder // se we''ll reduce the property set to the properties folderView.PropertySet = new PropertySet (FolderSchema.DisplayName, FolderSchema.Id); FindFoldersResults folderResults; do { folderResults = myService.FindFolders (baseFolderId, folderView); foreach (Folder folder in folderResults) if (String.Compare (folder.DisplayName, folderName, StringComparison.OrdinalIgnoreCase) == 0) return folder.Id; if (folderResults.NextPageOffset.HasValue) // go to the next page folderView.Offset = folderResults.NextPageOffset.Value; } while (folderResults.MoreAvailable); return null; } static void MyTest () { // IMPORTANT: ExchangeService is NOT thread safe, so one should create an instance of // ExchangeService whenever one needs it. ExchangeService myService = new ExchangeService (ExchangeVersion.Exchange2007_SP1); myService.Credentials = new NetworkCredential ("[email protected]", "myPassword00"); myService.Url = new Uri ("http://mailwebsvc-t.services.local/ews/exchange.asmx"); // next line is very practical during development phase or for debugging myService.TraceEnabled = true; Folder myPublicFoldersRoot = Folder.Bind (myService, WellKnownFolderName.PublicFoldersRoot); string myPublicFolderPath = @"OK soft GmbH (DE)/Gruppenpostfächer/_Template - Gruppenpostfach/_Template - Kalender"; string[] folderPath = myPublicFolderPath.Split(''//'); FolderId fId = myPublicFoldersRoot.Id; foreach (string subFolderName in folderPath) { fId = FindPublicFolder (myService, fId, subFolderName); if (fId == null) { Console.WriteLine ("ERROR: Can''t find public folder {0}", myPublicFolderPath); return; } } // verify that we found Folder folderFound = Folder.Bind (myService, fId); if (String.Compare (folderFound.FolderClass, "IPF.Appointment", StringComparison.Ordinal) != 0) { Console.WriteLine ("ERROR: Public folder {0} is not a Calendar", myPublicFolderPath); return; } CalendarFolder myPublicFolder = CalendarFolder.Bind (myService, //WellKnownFolderName.Calendar, fId, PropertySet.FirstClassProperties); if (myPublicFolder.TotalCount == 0) { Console.WriteLine ("Warning: Public folder {0} has no appointment. We try to create one.", myPublicFolderPath); Appointment app = new Appointment (myService); app.Subject = "Writing a code example"; app.Start = new DateTime (2010, 9, 9); app.End = new DateTime (2010, 9, 10); app.RequiredAttendees.Add ("[email protected]"); app.Culture = "de-DE"; app.Save (myPublicFolder.Id, SendInvitationsMode.SendToNone); } // We will search using paging. We will use page size 10 ItemView viewCalendar = new ItemView (10); // we can include all properties which we need in the view // If we comment the next line then ALL properties will be // read from the server. We can see there in the debug output viewCalendar.PropertySet = new PropertySet (ItemSchema.Subject); viewCalendar.Offset = 0; viewCalendar.OffsetBasePoint = OffsetBasePoint.Beginning; viewCalendar.OrderBy.Add (ContactSchema.DateTimeCreated, SortDirection.Descending); FindItemsResults<Item> findResultsCalendar; do { findResultsCalendar = myPublicFolder.FindItems (viewCalendar); foreach (Item item in findResultsCalendar) { if (item is Appointment) { Appointment appoint = item as Appointment; Console.WriteLine ("Subject: /"{0}/"", appoint.Subject); } } if (findResultsCalendar.NextPageOffset.HasValue) // go to the next page viewCalendar.Offset = findResultsCalendar.NextPageOffset.Value; } while (findResultsCalendar.MoreAvailable); } static void Main (string[] args) { MyTest(); } } }

Debe actualizar la cadena myPublicFolderPath al valor con su carpeta de calendario público. Configuro myService.TraceEnabled = true que produce un resultado largo con información de depuración. Deberías de causar eliminar la línea para producción.

ACTUALIZADO : algunos enlaces adicionales que puede encontrar en Crear nuevo soporte de sistema de calendario en Exchange OWA . Si aún no ha visto los videos y desea usar los servicios web de Exchange, le recomendaría que los vea allí. Podría ahorrarle tiempo en el futuro.

Tenemos un calendario público para nuestra empresa configurado en una carpeta pública de Exchange 2007. Puedo recuperar mis citas del calendario personal para el día actual usando el siguiente código. He buscado en línea alta y baja y no puedo encontrar un ejemplo de alguien que recupera información del calendario de un calendario de carpeta pública.

Parece que debería ser factible, pero no puedo hacerlo funcionar. ¿Cómo puedo modificar el código a continuación para acceder al calendario? No estoy interesado en crear citas a través de asp.net, solo recuperando una lista simple. Estoy abierto a cualquier otra sugerencia también. Gracias.

BOUNTY AÑADIDO
- No puedo ser la única persona que alguna vez necesitó hacer esto. Hagamos que este problema se resuelva para las generaciones futuras.

ACTUALIZADO DE NUEVO POR IGNORANCIA
- No mencioné que el proyecto en el que estoy trabajando es .NET 2.0 (muy importante, ¿no crees?).

* AÑADIDO MI SOLUCIÓN DE CÓDIGO A CONTINUACIÓN *
- He reemplazado mi código original con el código que terminó funcionando. Muchas gracias a Oleg por proporcionar el código para encontrar la carpeta pública, que fue la parte más difícil. He modificado el código usando el ejemplo de aquí http://msexchangeteam.com/archive/2009/04/21/451126.aspx para usar el método FindAppointments más simple.

Este sencillo ejemplo devuelve una cadena html con las citas, pero puede usarla como base para personalizarla según sea necesario. Puedes ver nuestra ida y vuelta bajo su respuesta a continuación.

using System; using Microsoft.Exchange.WebServices.Data; using System.Net; namespace ExchangePublicFolders { public class Program { public static FolderId FindPublicFolder(ExchangeService myService, FolderId baseFolderId, string folderName) { FolderView folderView = new FolderView(10, 0); folderView.OffsetBasePoint = OffsetBasePoint.Beginning; folderView.PropertySet = new PropertySet(FolderSchema.DisplayName, FolderSchema.Id); FindFoldersResults folderResults; do { folderResults = myService.FindFolders(baseFolderId, folderView); foreach (Folder folder in folderResults) if (String.Compare(folder.DisplayName, folderName, StringComparison.OrdinalIgnoreCase) == 0) return folder.Id; if (folderResults.NextPageOffset.HasValue) folderView.Offset = folderResults.NextPageOffset.Value; } while (folderResults.MoreAvailable); return null; } public static string MyTest() { ExchangeService myService = new ExchangeService(ExchangeVersion.Exchange2007_SP1); myService.Credentials = new NetworkCredential("USERNAME", "PASSWORD", "DOMAIN"); myService.Url = new Uri("https://MAILSERVER/ews/exchange.asmx"); Folder myPublicFoldersRoot = Folder.Bind(myService, WellKnownFolderName.PublicFoldersRoot); string myPublicFolderPath = @"PUBLIC_FOLDER_CALENDAR_NAME"; string[] folderPath = myPublicFolderPath.Split(''//'); FolderId fId = myPublicFoldersRoot.Id; foreach (string subFolderName in folderPath) { fId = Program.FindPublicFolder(myService, fId, subFolderName); if (fId == null) { return string.Format("ERROR: Can''t find public folder {0}", myPublicFolderPath); } } Folder folderFound = Folder.Bind(myService, fId); if (String.Compare(folderFound.FolderClass, "IPF.Appointment", StringComparison.Ordinal) != 0) { return string.Format("ERROR: Public folder {0} is not a Calendar", myPublicFolderPath); } CalendarFolder AK_Calendar = CalendarFolder.Bind(myService, fId, BasePropertySet.FirstClassProperties); FindItemsResults<Appointment> AK_appointments = AK_Calendar.FindAppointments(new CalendarView(DateTime.Now,DateTime.Now.AddDays(1))); string rString = string.Empty; foreach (Appointment AK_appoint in AK_appointments) { rString += string.Format("Subject: {0}<br />Date: {1}<br /><br />", AK_appoint.Subject, AK_appoint.Start); } return rString; } } }