If you use Microsoft Exchange 2007 SP1 or later you use Microsoft Exchange WebServices (aka EWS) to access users data, e.g. all appointments from Calendar. If the user is already logged in using Windows Credentials and these are passed in the browser, no additionall login is required. That’s convenient for the user, compared to e.g. IMAP where you always have to supply your windows password.
So here are some details which might help you if you want to use Microsofts Exchange Webservices:
Prerequisites:
1. Install Microsoft Exchange Web Services Managed API 2.0 on your developer client, available at https://www.microsoft.com/en-us/download/details.aspx?id=35371
2. Add reference to Microsoft.Exchange.WebServices.dll file within your project as described at http://msdn.microsoft.com/en-us/library/dd633626%28v=exchg.80%29.aspx
Get Access to the service:
The following Function establishes the connection to the service. If the user is not connected to Exchange SP1 or later, nothing is returned.
”’ <summary>
”’ Email Address for which the Appointments should be retrieved
”’ </summary>
”’ <param name=”emailAddress”>Valid email address, e.g. Test@nullexample.com</param>
”’ <returns>Service, otherwise nothing</returns>
”’ <remarks></remarks>
Friend Shared Function GetService(emailAddress As String) As Microsoft.Exchange.WebServices.Data.ExchangeService
Dim Service As Microsoft.Exchange.WebServices.Data.ExchangeService = Nothing
Try
Service = New Microsoft.Exchange.WebServices.Data.ExchangeService(Microsoft.Exchange.WebServices.Data.ExchangeVersion.Exchange2007_SP1)
‘ Microsoft recommends to use AutoDiscoverUrl to ensure that always the best endpoint for the given user is used.
Service.AutodiscoverUrl(emailAddress)
Service.UseDefaultCredentials = True
Catch ex As Microsoft.Exchange.WebServices.Data.AutodiscoverLocalException
‘Seems that user does not work on Exchange 2007 SP1 or later?
End Try
Return Service
End Function
Note: To get the email address of current user you might use System.DirectoryServices.AccountManagement.UserPrincipal.Current.EmailAddress.
Create DataTable with all Appointments
The following function creates a table with all existing appointments of current user within the defined timerange. In Appointments-Datatable I have the structure already defined. As you see I use some basic data from the appointments, e.g. Start, End, Subject etc. If you want more properties don’t forget to add these to the service.LoadPropertiesForItems, otherwise they are not accessible.
Imports Microsoft.Exchange.WebServices.Data
”’ <summary>
”’ Retrieve a table with all appointments found in given mailbox in given folder
”’ </summary>
”’ <param name=”appointments”>Datatable containing all appointments from current user which are already retrieved before</param>
”’ <returns>Datatable with appointments if appointments are found in given folder. Otherwise nothing.</returns>
”’ <remarks></remarks>
Private Overloads Function GetAllAppointmentsFromMailbox(service As ExchangeService, retrievalDays As Integer, appointments as DataTable) As DataTable
Dim cFolder As Folder
Dim cView As CalendarView
Dim findResults As FindItemsResults(Of Appointment)
Dim count As Integer
Dim CutOffDate As DateTime
Dim CutOffDateFuture As DateTime
CutOffDate = Now.AddDays((-1) * retrievalDays)
CutOffDateFuture = Now.AddDays(retrievalDays)
cFolder = Folder.Bind(service, WellKnownFolderName.Calendar)
cView = New CalendarView(CutOffDate, CutOffDateFuture)
findResults = service.FindAppointments(cFolder.Id, cView)
count = findResults.Count
If count > 0 Then
service.LoadPropertiesForItems(findResults.Items, New PropertySet(AppointmentSchema.Subject, AppointmentSchema.Location, AppointmentSchema.Body, _
AppointmentSchema.Start, AppointmentSchema.End, AppointmentSchema.IsAllDayEvent, _
AppointmentSchema.Body, AppointmentSchema.IsRecurring, AppointmentSchema.Recurrence, _
AppointmentSchema.Id, AppointmentSchema.ICalUid, AppointmentSchema.OptionalAttendees, _
AppointmentSchema.RequiredAttendees, AppointmentSchema.Organizer, AppointmentSchema.MyResponseType))
Dim CategoryIDForNewAppointments As Integer = CInt(ConfigurationManager.AppSettings(“CategoryIDForNewAppointments”))
Dim i As Integer
Dim Row As DataRow
Dim Participant As Attendee
Dim Participants As String
For i = 0 To findResults.TotalCount – 1
With findResults.Items(i)
If Appointments.Rows.Find(.ICalUid) Is Nothing Then
Row = Appointments.NewRow
Row(“UID”) = .ICalUid
Row(“StartDate”) = .Start
Row(“EndDate”) = .End
Row(“Subject”) = .Subject
Row(“Description”) = .Body
Row(“Location”) = .Location
Row(“Organizer”) = .Organizer.Name
Participants = String.Empty
For Each Participant In .RequiredAttendees
If String.IsNullOrWhiteSpace(Participants) Then
Participants = Participant.Name
Else
Participants &= “; ” & Participant.Name
End If
Next
For Each Participant In .OptionalAttendees
If String.IsNullOrWhiteSpace(Participants) Then
Participants = Participant.Name
Else
Participants &= “; ” & Participant.Name
End If
Next
Row(“Participants”) = Participants
Row(“Status”) = .MyResponseType.ToString
Appointments.Rows.Add(Row)
End If
End With
Next
GetAllAppointmentsFromMailbox = Appointments
Else
GetAllAppointmentsFromMailbox = Nothing
End If
End Function
Using EWS on a Webserver
If you want to use EWS within an ASP.net application on your IIS you need to activate “Trust computer for delegation”. As the description says: “This security-sensitive option means that services running as localsystem on this computer can request services from other servers.” If it’s deactivated you won’t be able to access any mailboxes on your exchange servers using EWS. So go to your active directory, open the computer account of your IIS application server and tick the checkbox. See also MSDN Blog entry EWS from a Web Application using Windows Authentication and Impersonation.
Leave a comment