Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Extract Exchange 2007 Public Calendar Appointments using Exchange Web Services API

Tags:

We have a public calendar for our company set up in an Exchange 2007 Public Folder. I am able to retrieve my personal calendar appointments for the current day using the code below. I have searched high and low online and I cannot find one example of someone retrieving calendar information from a Public Folder calendar.

It seems like it should be doable, but I cannot for the life of me get it working. How can I modify the code below to access the calendar? I am not interested in creating any appointments through asp.net, just retrieving a simple list. I am open to any other suggestions as well. Thanks.

ADDED BOUNTY
- I can't be the only person that ever needed to do this. Let's get this problem solved for future generations.

UPDATED AGAIN DUE TO IGNORANCE
- I failed to mention that the project I am working on is .NET 2.0 (very important don't you think?).

* ADDED MY CODE SOLUTION BELOW *
- I have replaced my original code example with the code that ended up working. Many thanks to Oleg for providing the code to find the public folder, which was the hardest part.. I have modified the code using the example from here http://msexchangeteam.com/archive/2009/04/21/451126.aspx to use the simpler FindAppointments method.

This simple example returns an html string with the appointments, but you can use it as a base to customize as needed. You can see our back and forth under his answer below.

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;     }      } } 
like image 938
NinjaBomb Avatar asked Sep 02 '10 21:09

NinjaBomb


People also ask

How do I get appointments and meetings from EWS in exchange?

Get appointments and meetings by using EWS in Exchange. Learn how to get appointments and meetings by using the EWS Managed API or EWS in Exchange. You can retrieve appointments and meetings from a calendar folder by using the CalendarFolder.FindAppointments EWS Managed API method or the FindItem EWS operation.

What object does exchange 2010 use for meetings and appointments?

Internally, Exchange uses the same object for both meetings and appointments. You use the EWS Managed API Appointment class or the EWS CalendarItem element to work with meetings and appointments.

How to retrieve appointments and meetings from a calendar folder?

You can retrieve appointments and meetings from a calendar folder by using the CalendarFolder.FindAppointments EWS Managed API method or the FindItem EWS operation. Get appointments by using the EWS Managed API.

How do I get the number of appointments in a calendar?

// Initialize values for the start and end times, and the number of appointments to retrieve. DateTime startDate = DateTime.Now; DateTime endDate = startDate.AddDays (30); const int NUM_APPTS = 5; // Initialize the calendar folder object with only the folder ID.


1 Answers

Like promised here is a code example. I used the Microsoft Exchange Web Services (EWS) Managed API 1.0 and recommend you to do the same. The most comments I included in the code

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();         }     } } 

You should update the string myPublicFolderPath to the value with your public calender folder. I set myService.TraceEnabled = true which produce long output with debug information. You should of cause remove the line for production.

UPDATED: Some additional links you could find in Create new calendar system support in Exchange OWA. If you not yet seen the videos and you want to use Exchange Web Services I would recommend you to watch there. It could save your time in the future.

like image 183
Oleg Avatar answered Oct 20 '22 04:10

Oleg