Working with meeting requests in Exchange ActiveSync
This post is part of an ongoing series that covers Microsoft Exchange ActiveSync for developers.
In this post, we are using Exchange ActiveSync protocol version 14.1. Where applicable, we note differences between protocol versions.
Meeting requests are important for information workers who use Microsoft Exchange. Meeting requests inform attendees of a meeting, automatically book meeting time on the organizer's and attendees' calendars, provide reminders for meetings, and enable the booking of conference rooms. This post provides information for developers about working with meeting requests, including the following topics:
- How meeting requests are created by using Exchange ActiveSync.
- How invitees' Exchange ActiveSync clients interpret meeting requests.
Note: Other topics related to calendaring with Exchange ActiveSync, such as recurring meetings; delegation; and meeting responses, updates, and cancellations, will be covered in future blog posts.
The following figure shows an overview of the meeting request process and the two key scenarios involved. In this example, Exchange ActiveSync user Alice requests a meeting with Bob from her Exchange ActiveSync client. Bob sees the meeting request on his Exchange ActiveSync device.
Figure 1: Meeting request process
Scenario 1: Organizer creates meeting request by using an Exchange ActiveSync client
A meeting starts out as a meeting request. The meeting organizer requests that attendees agree to participate in the meeting at a specified date, time, and location. Meeting requests are composed of the following two elements:
1. A calendar item that reflects the proposed meeting on the organizer's and invitees' calendars.
2. An invitation email sent by the organizer to invitees to notify them of the proposed meeting and solicit their responses.
In order for a user to create meeting requests, an Exchange ActiveSync client must do the following:
- Add a new calendar event to the organizer's calendar that includes the meeting details.
- Send an email to prospective attendees that includes the meeting details and response options.
After the Exchange ActiveSync client sends an email message that includes the meeting invitation, the Exchange server sends the invitation and saves a copy in the Sent Items folder. The following figure shows the client requests and server responses when a user, Alice, creates a meeting request from her Exchange ActiveSync client. The syncing of the Sent Items folder is optional.
Figure 2: Sending a meeting request from an Exchange ActiveSync client
Adding meeting details to the organizer's calendar
Important: The client must sync the Calendar folder before the user can create meeting requests. This adds the calendar item to the organizer's calendar. The organizer's mailbox requires the calendar item to reconcile responses to the meeting request.
Request to create the calendar item
When a user organizes a new meeting on the Exchange ActiveSync client, the client must create a meeting item on the organizer's calendar. The client adds the new calendar item to the Calendar collection. The calendar item contains all the meeting details, including meeting attendees. The following example shows an Exchange ActiveSync Sync command XML request that adds a meeting to Alice's calendar when she organizes a meeting and invites Bob.
<? xml version="1.0" encoding="utf-8"?>
<Sync>
< Collections>
<Collection>
<SyncKey>85086007 </SyncKey>
<CollectionId>2</CollectionId>
<Commands>
<Add>
<ClientId>1574070035</ClientId>
<ApplicationData>
<calendar:TimeZone>4AEAAFAAYQBjAGkAZgBpAGMAIABTAHQAYQBuAGQAYQByAGQAIABUAGkAbQBlAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAABAA
IAAAAAAAAAAAAAAFAAYQBjAGkAZgBpAGMAIABEAGEAeQBsAGkAZwBoAHQAIABUAGkAbQBlAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAMAAAACAAIAA AAAAAAAxP///w==</calendar:TimeZone>
<calendar:DtStamp>20110504T152200Z</calendar:DtStamp>
<calendar:StartTime>20110510T170000Z</calendar:StartTime>
<calendar:Subject>Quarterly Planning</calendar:Subject>
<calendar:UID>A3561BDAAE8E4B30AC255FD3F31A3AD700000000000000000000000000000000</calendar:UID>
<calendar:Attendees>
<calendar:Attendee>
<calendar:Email>bob@contoso.com</calendar:Email>
<calendar:Name>Bob</calendar:Name>
<calendar:AttendeeStatus>0</calendar:AttendeeStatus>
<calendar:AttendeeType>1</calendar:AttendeeType>
</calendar:Attendee>
</calendar:Attendees>
<calendar:Location>Office</calendar:Location>
<calendar:EndTime>20110510T180000Z</calendar:EndTime>
<airsyncbase:Body>
<airsyncbase:Type>3</airsyncbase:Type>
<airsyncbase:Data>Let's meet to plan the budget for the next quarter.
</airsyncbase:Data>
</airsyncbase:Body>
<calendar:Sensitivity>0</calendar:Sensitivity>
<calendar:BusyStatus>2</calendar:BusyStatus>
<calendar:AllDayEvent>0</calendar:AllDayEvent>
<calendar:Reminder>5</calendar:Reminder>
<calendar:MeetingStatus>1</calendar:MeetingStatus>
</ApplicationData>
</Add>
</Commands>
</Collection>
</Collections>
</Sync>
For a list of and information about the Calendar schema elements for Exchange ActiveSync, see [MS-ASCAL]: ActiveSync Calendar Class Protocol Specification section 2.2.2.
In the meeting request, the Exchange ActiveSync client must specify the start time and end time of the proposed event; this information is included in the StartTime and EndTime elements. Both dates have to be valid values of the dateTime type, as described in [MS-ASDTYPE]: ActiveSync Data Types section 2.3. All dates must be specified in Coordinated Universal Time (UTC), without any punctuation separators. Optionally, the client can use the DtStamp element to specify when the calendar item was created.
The client should specify the time zone in the request. If the time zone is not specified, the Exchange server uses its current time zone for the meeting. For more information about the format of the time zone, see [MS-ASDTYPE] section 2.6.4.
Optionally, the client can mark the organizer's calendar by specifying the BusyStatus element. The following are the possible values for the BusyStatus element:
· 0 – Free
· 1 – Tentative
· 2 – Busy
· 3 – Out of office
If the organizer did not explicitly specify his or her attendance status, the client should use a value of 2 for the BusyStatus element to mark the meeting status as busy. If the client does not provide this value, the server uses a busy status by default.
Important: As a best practice, the client should always provide a value for the optional UID element. The UID element value is a random hexadecimal ID that the client generates when it creates the calendar item. The maximum length of the UID element value is 300 characters. We strongly recommend that the Exchange ActiveSync client include the UID element because it helps to map the calendar item to the email notifications sent for the meeting. This enables the organizer to track meeting updates and responses to the meeting request.
The client should provide a MeetingStatus element for meetings. When the client saves a meeting to the organizer's calendar, it should set the value of this element to 1, which indicates that the item is a meeting.
A meeting must include the Attendees element, which contains a collection of Attendee elements. Each Attendee element must include at least one Email and one Name element; these contain the name and email address of the attendee. Optionally, the Attendee element can include values for the AttendeeStatus and AttendeeType elements. When the meeting is created, the AttendeeStatus element contains a value of 0. This value changes when attendees respond to the meeting request. If present, the AttendeeType element must be set to one of the following values:
· 1 – Required
· 2 – Optional
· 3 – Resource
Server response to the request to create the calendar item
The Exchange server sends a response to the Exchange ActiveSync client's request. The response indicates the status of the Calendar Sync command operation as well as the status of the individual meeting request. If the item was added correctly (as indicated by a Status element value of 1 in the response for both the item and the collection), the server issues a ServerId element value for the item in lieu of the temporary ClientId element value that the client assigned to it, as shown in the following example.
HTTP/1.1 200 OK
Content-Type: application/vnd.ms-sync.wbxml
<? xml version="1.0" encoding="utf-8"?>
< Sync>
<Collections>
<Collection>
<SyncKey>1042177286 </SyncKey>
<CollectionId>2</CollectionId>
<Status>1</Status>
<Responses>
<Add>
<ClientId>1574070035</ClientId>
<ServerId>2:9</ServerId>
<Status>1</Status>
</Add>
</Responses>
</Collection>
</Collections>
</Sync>
The client has to associate the newly issued ServerId value with this calendar item. For more information about status response values, see [MS-ASCMD]: ActiveSync Command Reference Protocol Specification.
Note: Exchange ActiveSync clients should not allow the organizer to respond to meetings that he or she organized
Informing attendees of the meeting details by email notification
The email notification must make it clear to the recipients that its purpose is to inform them of the meeting request. It can also optionally solicit invitee responses to the request, and automatically block the meeting time on prospective attendees' calendars.
Client request to send the meeting email message
Exchange ActiveSync clients use the SendMail command to send MIME-formatted email messages to the server, including calendaring information structured according to a known calendaring format.
The iCalendar format is the most common calendaring format; this format is supported by a variety of clients. The following example shows the Exchange ActiveSync SendMail request that Alice's Exchange ActiveSync client sends.
POST /Microsoft-Server-ActiveSync/default.eas?Cmd=SendMail&User=Alice&DeviceId=ABCDEFGH&DeviceType=SmartPhone HTTP/1.1
Content-Length: 2100
Content-Type: application/vnd.ms-sync.wbxml
Host: mail.contoso.com
User-Agent: SmartPhone
RequestBody :
<?xml version="1.0" encoding="utf-8" ?>
<SendMail xmlns="ComposeMail:" >
<ClientId>1248</ClientId>
<SaveInSentItems/>
<Mime>MIME-Version: 1.0
Subject: Quarterly Planning
Thread-Topic: Quarterly Planning
To: Bob <bob@contoso.com>
Content-Type: multipart/alternative;
boundary="---Next Part---"
-----Next Part---
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain; charset="utf-8"
Let's discuss the budget for the next quarter.
-----Next Part---
Content-Type: text/calendar; charset="utf-8"; method=REQUEST
Content-Transfer-Encoding: base64
QkVHSU46VkNBTEVOREFSDQpNRVRIT0Q6UkVRVUVTVA0K… <Abbreviated>
-----Next Part---
</Mime>
</SendMail>
The email message contains multiple parts. The message may contain a plain text part, which includes the body text of the meeting request. Several different calendar request formats are available for meeting request messages. Microsoft Exchange supports the iCalendar and TNEF formats. Each of these formats are included in a separate MIME part in the meeting request message. (For more information about MIME, see RFC 2045, RFC 2046, and RFC 2047.) Most clients use the iCalendar format for the meeting request, encoded in base64. Meeting requests have a content type of text/calendar with the method parameter set to “REQUEST”. The following section provides more detail about the iCalendar format.
iCalendar format
The iCalendar format is a file format (extension .ics, .ical) that represents calendaring information such as meeting requests, meeting responses, and free/busy information. For more information about this format, see RFC 2445, RFC 5546, and [MS-OXCICAL]: iCalendar to Appointment Object Conversion Protocol Specification.
This standard enables users of different calendaring systems (including clients and servers) to exchange calendaring information. iCalendar information is transported across the Internet in MIME format. The MIME body that contains the iCalendar information has a content type of text/calendar. The following example shows a typical iCalendar meeting request.
BEGIN:VCALENDAR
METHOD:REQUEST
PRODID: SmartPhone
VERSION:2.0
BEGIN:VTIMEZONE
TZID:Pacific Standard Time
BEGIN:STANDARD
DTSTART:20000101T020000
TZOFFSETFROM:-0700
TZOFFSETTO:-0800
RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=1SU;BYMONTH=11
END:STANDARD
BEGIN:DAYLIGHT
DTSTART:20000101T020000
TZOFFSETFROM:-0800
TZOFFSETTO:-0700
RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=2SU;BYMONTH=3
END:DAYLIGHT
END:VTIMEZONE
BEGIN:VEVENT
UID:A3561BDAAE8E4B30AC255FD3F31A3AD700000000000000000000000000000000
ORGANIZER:MAILTO:alice@contoso.com
ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION:MAILTO:bob@contoso.com
STATUS:CONFIRMED
X-MICROSOFT-CDO-ALLDAYEVENT:FALSE
BEGIN:VALARM
ACTION:DISPLAY
TRIGGER:-PT15M
END:VALARM
SUMMARY: Quarterly Planning
LOCATION:
DTSTART;TZID=Pacific Standard Time:20110510T100000
DTEND;TZID=Pacific Standard Time:20110510T110000
DTSTAMP: 20110504T152200Z
LAST-MODIFIED: 20110504T152200Z
CLASS:PUBLIC
END:VEVENT
END:VCALENDAR
Important: The UID element value that is included in the iCalendar request email message must match the UID value that is saved with the meeting item on the organizer's calendar.
Server response to the client request to send the meeting email message
The response to SendMail command has no XML body (Content-Length = 0) if the SendMail command finishes successfully, as shown in the following example.
HTTP/1.1 200 OK
MS-Server-ActiveSync: 14.1
The server first responds to the SendMail request from the organizer's Exchange ActiveSync client, and then tries to send the message to the attendees. For this reason, a positive response to the SendMail request does not guarantee that the message was sent out successfully. The Exchange ActiveSync client can still receive a non-delivery report notification if the mail recipients are not found. For more information about the SendMail status values, see [MS-ASCMD] section 2.2.3.152.13. Non-delivery report responses should be handled in the same way that email responses are handled.
Before the Exchange server sends the email message, it interprets the iCalendar information and structures the message to the attendees to reflect that it is a meeting request.
Saving the meeting notification in Sent Items
Note: Exchange ActiveSync clients should not save meeting request messages directly to the local Sent Items folder; instead, clients should use the SaveInSentItems element in the SendMail request to automatically save the messages on the server. It is not possible to reconcile the local Sent Items folder with the server's Sent Items folder by using the Sync command. Items in the server's Sent Items folder can be added to the client by using the Sync command, but items that are in the Exchange ActiveSync client's local Sent Items folder cannot be added to the server.
After the Exchange ActiveSync client submits the meeting request email to the server, the Exchange server sends the email message to all the invited attendees. In addition, the Exchange server parses the iCalendar information that is embedded in the email. This way, it adds the email message to the Sent Items folder as the appropriate type; that is, a meeting request. The next time the Exchange ActiveSync client syncs the Sent Items folder, the meeting request email message will be added to the Sent Items folder on the client.
Client request to sync the Sent Items folder
The client syncs the Sent Items folder as shown in the following example.
POST /Microsoft-Server-ActiveSync?Cmd=Sync &User=alice&DeviceId=ABCDEFGH&DeviceType =SmartPhone HTTP/1.1
Content-Type: application/vnd.ms-sync.wbxml
MS-ASProtocolVersion: 14.1
User-Agent: ASOM
Host: mail.contoso.com
<?xml version="1.0" encoding="utf-8"?>
<Sync xmlns="AirSync:">
<Collections>
<Collection>
<SyncKey>612092836</SyncKey>
<CollectionId>10</CollectionId>
<DeletesAsMoves>1</DeletesAsMoves>
<GetChanges>1</GetChanges>
<WindowSize>512</WindowSize>
</Collection>
</Collections>
</Sync>
Server response to the request to sync the Sent Items folder
The server adds a new item with the MessageClass element set to IPM.Schedule.Meeting.Request, as shown in the following example. This item contains all the meeting details.
HTTP/1.1 200 OK
Content-Type: application/vnd.ms-sync.wbxml
<? xml version="1.0" encoding="utf-8" ?>
<Sync xmlns="AirSync:">
<Collections>
<Collection>
<SyncKey>333054644</SyncKey>
<CollectionId>10</CollectionId>
<Status>1</Status>
<Commands>
<Add>
<ServerId>10:20</ServerId>
<ApplicationData>
<email:To>"Bob" <bob@contoso.com></email:To>
<email:From>"Alice" <alice@contoso.com></ email:From>
<email:Subject>Quarterly Planning</email:Subject>
<email:DateReceived>2011-05-10T18:52:57.298Z</A2:DateReceived>
<email:DisplayTo>”Bob”</ email:DisplayTo>
<email:ThreadTopic>Quarterly Planning</email:ThreadTopic>
<email:Importance>1</email:Importance>
<email:Read>1</email:Read>
<airsyncbase:Body>
<airsyncbase:Type>1</airsyncbase:Type>
<airsyncbase:EstimatedDataSize>117</airsyncbase:EstimatedDataSize>
<airsyncbase:Truncated>1</airsyncbase:Truncated>
</airsyncbase:Body>
<email:MessageClass>IPM.Schedule.Meeting.Request</email:MessageClass>
<email:MeetingRequest>
<email:AllDayEvent>0</email:AllDayEvent>
<email:StartTime>2011-05-10T19:00:00.000Z</email:StartTime>
<email:DtStamp>2011-05-10T18:52:58.770Z</email:DtStamp>
<email:EndTime>2011-05-10T20:00:00.000Z</email:EndTime>
<email:Location>Office</email:Location>
<email:Organizer>"Alice" <alice@contoso.com></ email:Organizer>
<email:Sensitivity>0</email:Sensitivity>
<email:TimeZone>4AEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAABAAIAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAACAAIAAAAAAAAAxP///w==</email:TimeZone>
<email:GlobalObjId> BAAAAIIA4AB0xbcQGoLgCAAAAAAAAAAAAAAAAAAAAAAAAAAATQA
AAHZDYWwtVWlkAQAAAEEzNTYxQkRBQUU4RTRCMzBBQzI1NUZEM0YzMUEzQUQ3MDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAA</email:GlobalObjId>
<email:MeetingMessageType>1</email:MeetingMessageType>
</email:MeetingRequest>
<email:InternetCPID>20127</email:InternetCPID >
<email:Flag />
<email:ContentClass>urn:content-classes:calendarmessage</email:ContentClass>
<airsyncbase:NativeBodyType>1</airsyncbase:NativeBodyType>
<email2:ConversationId>A0B01C50859A444590FE77CF0568F16E</email:ConversationId>
<email2:ConversationIndex>01CC0F437A</email:ConversationIndex>
<email2:Sender>"Alice" <alice@contoso.com></ email:Sender>
<email:Categories />
</ApplicationData>
</Add>
</Commands>
</Collection>
</Collections>
</Sync>
The meeting request email that is sent to the attendees is of type IPM.Schedule.MeetingRequest and contains a MeetingRequest container. (For more information about the MeetingRequest container, see [MS-ASEMAIL]: ActiveSync E-Mail Class Protocol Specification section 2.2.2.14). This container describes the properties of the meeting. In addition, it now contains the GlobalObjId element value that was assigned to the meeting item by the server.
The GlobalObjId element value identifies the meeting request and allows the client to determine whether it corresponds to an existing object in the Calendar. For more information about the GlobalObjId element, see [MS-ASEMAIL] section 2.2.2.14.15. The UID element value assigned to the calendar item by the Exchange ActiveSync client is included in the GlobalObjId element value that the server returns. The GlobalObjId element value does not change when the meeting is updated. This enables the client to identify which meeting a particular notification corresponds to.
This meeting request message that is added to the organizer's Sent Items folder should not expose any response options to the user because it is in the organizer's mailbox.
Scenario 2: A meeting invitee receives a meeting request on the Exchange ActiveSync client
When an organizer sends a meeting request, the invitees' Exchange ActiveSync client must be able to receive the request, interpret it, and present it to the invitee as a meeting invitation. The meeting request should appear in the invitee's Inbox, and a placeholder Calendar item for the meeting should appear on the invitee's Calendar. The invitee should be able to accept, tentatively accept, or decline the meeting request, either from the meeting invitation or from the Calendar placeholder item, and send his or her response the meeting organizer.
The following figure shows the operations involved in sending a meeting request to an Exchange ActiveSync client. In this example, Bob is the meeting invitee.
Figure 3: Sending a meeting request to an Exchange ActiveSync client
Adding the meeting request to the invitee's Inbox
When the meeting invitation first arrives in the invitee's mailbox, it is in the form of a meeting request in the Inbox.
Receiving the meeting request
The Exchange ActiveSync client receives the meeting request upon issuing a Sync command request for the invitee's Inbox. We recommend that Exchange ActiveSync clients request body items in HTML format by setting the BodyPreference element to 2. HTML provides rich content formatting that the client can then render. The meeting request is shown in the following example.
POST /Microsoft-Server-ActiveSync?Cmd=Sync&User =bob&DeviceId=HGFEDCBA &DeviceType=SmartPhone HTTP/1.1
Content-Type: application/vnd.ms-sync.wbxml
MS-ASProtocolVersion: 14.1
User-Agent: ASOM
Host: mail.contoso.com
<?xml version="1.0" encoding="utf-8"?>
<Sync xmlns="AirSync:">
<Collections>
<Collection>
<SyncKey>1530765051</SyncKey>
<CollectionId>6</CollectionId>
<DeletesAsMoves>1</DeletesAsMoves>
<GetChanges>1</GetChanges>
<WindowSize>512</WindowSize>
<Options>
<airsyncbase:BodyPreference>
<airsyncbase:Type>2</airsyncbase:Type>
</airsyncbase:BodyPreference>
</Options>
</Collection>
</Collections>
</Sync>
Server response to the Sync command request
The organizer's Exchange server converts the item's iCalendar information and parses it into a message class of IPM.Schedule.Meeting.Request, which is then synced to the invitee's Inbox, as shown in the following example.
Note: The Exchange ActiveSync client should not attempt any iCalendar content conversion. The Exchange server converts the iCalendar format into the appropriate message class. If the message cannot be converted, it will be delivered as an attachment.
HTTP/1.1 200 OK
Content-Type: application/vnd.ms-sync.wbxml
<?xml version="1.0" encoding="utf-8"?>
<Sync>
<Collections>
<Collection>
<SyncKey>1473331151</SyncKey>
<CollectionId>6</CollectionId>
<Status>1</Status>
<Commands>
<Add>
<ServerId>6:17</ServerId>
<ApplicationData>
<email:To>"Bob" <bob@contoso.com></ email:To>
<email:From>"Alice" <alice@contoso.com></email:From>
<email:Subject>Quarterly Planning</email:Subject>
<email:DateReceived>20110504T152300Z</email:DateReceived>
<email:DisplayTo>Bob </A2:DisplayTo>
<email:ThreadTopic>Quarterly Planning</A2:ThreadTopic>
<email:Importance>1</A2:Importance>
<email:Read>0</A2:Read>
<airsyncbase:Body>
<airsyncbase:Type>2</airsyncbase:Type>
<airsyncbase:EstimatedDataSize>800</airsyncbase:EstimatedDataSize>
<airsyncbase:Data>
< html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Generator" content="Microsoft Exchange Server">
<!-- converted from rtf -->
<style><!-- .EmailQuote { margin-left: 1pt; padding-left: 4pt; border-left: #800000 2px
solid; } --
></style>
</head>
<body>
<font face="Times New Roman" size="3"><><a
name="BM_BEGIN"></a>
<div><font face="Courier New">[When]: Tuesday,May 10, 2011 9:00 PM-10:00 PM.
[(UTC-08:00) Pacific
Time (US &amp; Canada)]<br>
[Where]: Office<br>
<br>
*~*~*~*~*~*~*~*~*~*<br>
</font></div>
<div><font face="Tahoma" size="2"><>Let's meet to
plan the budget for the next quarter.<></font></div>
<></font>
</body>
</html>
</airsyncbase:Data>
</airsyncbase:Body>
<email:MessageClass>IPM.Schedule.Meeting.Request</email:MessageClass>
<email:MeetingRequest>
<email:AllDayEvent>0</email:AllDayEvent>
<email:StartTime>20110510T170000Z</email:StartTime>
<email:DtStamp>20110504T152200Z </email:DtStamp>
<email:EndTime>20110510T180000Z</email:EndTime>
<email:InstanceType>0</email:InstanceType>
<email:Location>Office</email:Location>
<email:Organizer>"Alice " <alice@contoso.com></ email:Organizer>
<email:ResponseRequested>1</email:ResponseRequested>
<email:Sensitivity>0</email:Sensitivity>
<email:BusyStatus>2</email:BusyStatus>
<email:TimeZone>4AEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAABAAIAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAMAAAACAAIAAAAAAAAAxP///w==</email:TimeZone>
<email:GlobalObjId> BAAAAIIA4AB0xbcQGoLgCAAAAAAAAAAAAAAAAAAAAAAAAAAATQAAAHZDYWwtV
WlkAQAAAEEzNTYxQkRBQUU4RTRCMzBBQzI1NUZEM0YzMUEzQUQ3MDAwMDAwMDA
wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAA</email:GlobalObjId>
<email:MeetingMessageType>1</email:MeetingMessageType>
</email:MeetingRequest>
<email:InternetCPID>28591</A2:InternetCPID>
<email:Flag />
<email:ContentClass>urn:content-classes:calendarmessage</email:ContentClass>
<airsyncbase:NativeBodyType>1</airsyncbase:NativeBodyType>
<email2:ConversationId>AF47F6E22518E64C800FFEA6B901B139</email2:ConversationId>
<email2:ConversationIndex>CC0F434BDC</email2:ConversationIndex>
<email:Categories />
</ApplicationData>
</Add>
</Commands>
</Collection>
</Collections>
</Sync>
The MeetingRequest element is an optional container element. The MeetingRequest element is included when the message is a meeting request and the Exchange ActiveSync client's user is an attendee. The MeetingRequest element is not included in the message content of calendar items in the Calendar folder or in regular email messages. If a message contains the MeetingRequest element, the client can respond to the meeting request by using the MeetingResponse command. For more information about this command, see [MS-ASCMD] section 2.2.2.9.
The GlobalObjId element is a required child element of the MeetingRequest element. GlobalObjId is defined as an element in the Email namespace. Clients that need to determine whether the GlobalObjId element for a meeting request corresponds to an existing Calendar object in the Calendar folder have to convert the GlobalObjId element value to a UID element value to make the comparison. For information about how this conversion is done, see [MS-ASEMAIL] section 2.2.2.14.15.
MeetingMessageType is a new element that was added in version 14.1 of the Exchange ActiveSync protocol. The MeetingMessageType element further defines the type of the meeting request. For information about this element, see [MS-ASEMAIL] section 2.2.2.14.17.
Client request to sync the Calendar folder
The invitee's (Bob's) Exchange ActiveSync client issues a Sync request for the Calendar folder, similar to the one shown in the following example.
POST /Microsoft-Server-ActiveSync?Cmd=Sync&User =bob &DeviceId=HGFEDCBA&DeviceType=SmartPhone HTTP/1.1
Content-Type: application/vnd.ms-sync.wbxml
MS-ASProtocolVersion: 14.1
User-Agent: ASOM
Host: mail.contoso.com
<?xml version="1.0" encoding="utf-8"?>
<Sync xmlns="AirSync:">
<Collections>
<Collection>
<SyncKey>1085571025</SyncKey>
<CollectionId>2</CollectionId>
</Collection>
</Collections>
</Sync>
Tentative meeting added to invitee's calendar
In Microsoft Exchange Server 2007 (which corresponds to Exchange ActiveSync protocol version 12.0) and later versions, the server parses the meeting request received in the invitee's Inbox and adds a tentative meeting to the invitee's calendar to mark the time of the proposed meeting. This tentative meeting is synced to the client.
Server response to the request to Sync the Calendar folder
Based on the meeting request that the Exchange server received, the server created a meeting item in Bob's Calendar folder with the UID element value previously specified by the organizer. Syncing the Calendar collection adds the meeting to the invitee's calendar.
Note: By default, Microsoft Exchange processes meeting requests and automatically add tentative meetings to the invitee's calendar. The Exchange ActiveSync client should not try to create the meeting item, as that will lead to conflicts between the calendar on the device and the calendar on the server. The administrator can disable tentative meeting creation by running the following Windows PowerShell command:
Set-CalendarProcessing -AddNewRequestsTentatively $false -Identity '<domain>/<user>'
In addition, by default, Microsoft Exchange only processes internal meeting requests . The Exchange administrator can allow external meetings to be processed by running the following Windows PowerShell command:
Set-CalendarProcessing -ProcessExternalMeetingMessages $true -Identity '<domain>/<user>'
If the administrator or the user has not changed the default behavior, any meetings received from senders outside the organization will not be processed and will not automatically be added as tentative meetings to the invitee's calendar.
The calendar item contains a UID element value that the organizer's client had set, which correlates to the meeting request in the Inbox via the GlobalObjId element.
HTTP/1.1 200 OK
Content-Type: application/vnd.ms-sync.wbxml
<?xml version="1.0" encoding="utf-8"?>
<Sync>
<Collections>
<Collection>
<SyncKey>665677459</SyncKey>
<CollectionId>2</CollectionId>
<Status>1</Status>
<Commands>
<Add>
<ServerId>2:24</ServerId>
<ApplicationData>
<calendar:TimeZone>4AEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsAAAABAAIAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAACAAIAAAAAAA
AAxP///w==</calendar:TimeZone>
<calendar:DtStamp>20110504T152200Z </calendar:DtStamp>
<calendar:StartTime>20110510T180000Z</calendar:StartTime>
<calendar:Subject>Quarterly Planning</calendar:Subject>
<calendar:UID>A3561BDAAE8E4B30AC255FD3F31A3AD700000000000000000
000000000000000</calendar:UID>
<calendar:OrganizerName>Alice </calendar:OrganizerName>
<calendar:OrganizerEmail>alice@contoso.com</calendar:OrganizerEmail>
<calendar:Attendees>
<calendar:Attendee>
<calendar:Email>bob@contoso.com</calendar:Email>
<calendar:Name>Bob </calendar:Name>
<calendar:AttendeeType>1</calendar:AttendeeType>
</calendar:Attendee>
</calendar:Attendees>
<calendar:Location>Office</calendar:Location>
<calendar:EndTime>20110510T190000Z</calendar:EndTime>
<airsyncbase:Body>
<airsyncbase:Type>2</airsyncbase:Type>
<airsyncbase:EstimatedDataSize>585</airsyncbase:EstimatedDataSize>
<airsyncbase:Data>
< html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Generator" content="Microsoft Exchange Server">
<!-- converted from rtf -->
<style><!-- .EmailQuote { margin-left: 1pt; padding-left: 4pt; border-left: #800000 2px
solid; } --
></style>
</head>
<body>
<font face="Times New Roman" size="3"><><a
name="BM_BEGIN"></a>
<div> <font face="Tahoma" size="2"><>Let's meet to
plan the budget for the next quarter.<></font></div>
<></font>
</body>
</html>
</airsyncbase:Data>
</airsyncbase:Body>
<calendar:Sensitivity>0</calendar:Sensitivity>
<calendar:BusyStatus>2</calendar:BusyStatus>
<calendar:AllDayEvent>0</calendar:AllDayEvent>
<calendar:Reminder>15</calendar:Reminder>
<calendar:MeetingStatus>3</calendar:MeetingStatus>
<airsyncbase:NativeBodyType>1</airsyncbase:NativeBodyType>
<calendar:ResponseRequested>1</calendar:ResponseRequested>
<calendar:ResponseType>5</calendar:ResponseType>
</ApplicationData>
</Add>
</Commands>
</Collection>
</Collections>
</Sync>
The meeting that is added to the invitee's Calendar collection contains all the properties of the calendar item on the organizer's Calendar, as well as the following additional elements:
· OrganizerName
· OrganizerEmail
· ResponseRequested
· MeetingStatus
· ResponseType
The value of the ResponseRequested element comes from the PARTSTAT parameter value of "NEEDS-ACTION" in the original iCalendar meeting request.
When the invitee receives the meeting request, the MeetingStatus element is set to 3, which indicates that the meeting was received, and the ResponseType element is set to 5, to indicate that the invitee has not yet responded to the meeting request. After the invitee responds, the server updates these values to reflect the new status. Stay tuned for our next blog post, "Working with meeting responses in Exchange ActiveSync", for more information about meeting responses.
Summary
Creating meeting requests and interpreting them from an Exchange ActiveSync client is critical to ensuring a successful calendaring experience for Exchange ActiveSync client users. It is important to use the correct iCalendar format to create meeting requests and to remember not to try to process incoming iCalendar requests on the client, but instead to allow the Exchange server to process the requests.
Related Resources
[MS-ASEMAIL]: ActiveSync E-Mail Class Protocol Specification
[MS-ASCAL]: ActiveSync Calendar Class Protocol Specification
[MS-ASCMD]: ActiveSync Email Command Reference Protocol Specification
[MS-ASDTYPE]: ActiveSync Data Types
[MS-OXGLOS]: Exchange Server Protocols Master Glossary
[MS-OXCICAL]: iCalendar to Appointment Object Conversion Protocol Specification
RFC 2045, "Multipurpose Internet Mail Extensions (MIME) Part One: Format of Internet Message Bodies"
RFC 2046, "Multipurpose Internet Mail Extensions (MIME) Part Two: Media Types"
RFC 2445, "Internet Calendaring and Scheduling Core Object Specification"
RFC 5546, "iCalendar Transport-Independent Interoperability Protocol (iTIP)"
Post authored by: Katarzyna Puchala, Microsoft Corporation
Comments
Anonymous
August 02, 2011
Great post, but a question: In EAS 12.0/12.1, is there any way for a client/attendee to know his own (previous) response to a meeting request (e.g. the client/attendee responded in Outlook/OWA)? In EAS 14, there's calendar:ResponseType, but there seems to be no equivalent in earlier versions. Thanks!Anonymous
August 19, 2011
Hi Marc, As we previously discussed over email, there is no way for an attendee to know his own previous response to a meeting request in Exchange ActiveSync 12.0 and 12.1. One of the reasons to move to Exchange ActiveSync 14.0 and 14.1!Anonymous
January 07, 2013
Hi , I am trying to upload a meeting request using this blog and also the old entry but with no success. Do you have any suggestions? stackoverflow.com/.../exchange-400-error-on-uploading-meeting ThanksAnonymous
April 29, 2014
Hi Katarzyna, I have a question regarding meeting invites. Is is possible for a meeting owner to know whether an attendee is free/busy at a particular time? e.g. I create an event on 30th April, 2014 10AM-11AM and add you as an invitee. Is it possible for me to know whether you are free (have no other meetings at the same time) or busy (have other meetings at the same time)? If yes, what element do we use for this?Anonymous
April 29, 2014
Vivek, have a look at the Availability element in the ResolveRecipients response. msdn.microsoft.com/.../gg675596(v=exchg.80).aspx