0
votes

I noticed the following behavior for recurring events with reminders:

  • If a reminder for an occurrence is dismissed the ReminderIsSet property remains true and the ReminderDueBy property is set to the date/time of the next occurrence
  • When the last occurrence reminder has been dismissed ReminderIsSet still remains true and the ReminderDueBy property keeps the date/time of the last occurrence
  • If the last occurrence reminder is not dismissed the same happens

In that last case, in a user interface like Outlook Web Access (OWA), there is an indicator of a pending reminder:

enter image description here

How does Exchange, and how can I, distinguish the last two cases? How can I know that the reminder for that last occurrence was not dismissed yet?

Below is the SOAP testdata that I see querying Exchange Web Services (EWS) for two recurring appointments. They have subjects App A and App B, both were set to repeat 7 and 8 March at 12:20-12:50 CET with a 10 minute reminder:

enter image description here

On 8 March (=last occurrence), I dismissed the reminder for App A at 12:12, but did nothing with the reminder for App B.

If I then do GetItem calls (with BaseShape AllProperties) for both occurrences I see differences in the lines marked * at the start below. I have no idea how to conclude from this that App B still has a pending reminder. What am I missing?

Appointment A

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
   <s:Header>
      <h:ServerVersionInfo MajorVersion="15" MinorVersion="0" MajorBuildNumber="1104" MinorBuildNumber="3" Version="V2_22" xmlns:h="http://schemas.microsoft.com/exchange/services/2006/types" xmlns="http://schemas.microsoft.com/exchange/services/2006/types" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
   </s:Header>
   <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <m:GetItemResponse xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages" xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">
         <m:ResponseMessages>
            <m:GetItemResponseMessage ResponseClass="Success">
               <m:ResponseCode>NoError</m:ResponseCode>
               <m:Items>
                  <t:CalendarItem>
*ChangeKey           <t:ItemId Id="AAMkAG[snip]AAAEA==" ChangeKey="DwAAABYAAACuuv05CWNWTKnqziXALsXrAACJ2zpT"/>
                     <t:ParentFolderId Id="AQMkA[snip]AAAA=" ChangeKey="AQAAAA=="/>
                     <t:ItemClass>IPM.Appointment.Occurrence</t:ItemClass>
*                    <t:Subject>App A</t:Subject>
                     <t:Sensitivity>Normal</t:Sensitivity>
                     <t:Body BodyType="Text"/>
*                    <t:DateTimeReceived>2016-03-08T11:06:34Z</t:DateTimeReceived>
*                    <t:Size>5243</t:Size>
                     <t:Importance>Normal</t:Importance>
                     <t:IsSubmitted>false</t:IsSubmitted>
                     <t:IsDraft>false</t:IsDraft>
                     <t:IsFromMe>false</t:IsFromMe>
                     <t:IsResend>false</t:IsResend>
                     <t:IsUnmodified>false</t:IsUnmodified>
*                    <t:DateTimeSent>2016-03-08T11:06:34Z</t:DateTimeSent>
*                    <t:DateTimeCreated>2016-03-08T11:06:33Z</t:DateTimeCreated>
                     <t:ResponseObjects>
                        <t:ForwardItem/>
                     </t:ResponseObjects>
                     <t:ReminderDueBy>2016-03-08T11:20:00Z</t:ReminderDueBy>
                     <t:ReminderIsSet>true</t:ReminderIsSet>
                     <t:ReminderMinutesBeforeStart>10</t:ReminderMinutesBeforeStart>
                     <t:DisplayCc/>
                     <t:DisplayTo/>
                     <t:HasAttachments>false</t:HasAttachments>
                     <t:Culture>nl-NL</t:Culture>
                     <t:EffectiveRights>
                        <t:CreateAssociated>false</t:CreateAssociated>
                        <t:CreateContents>false</t:CreateContents>
                        <t:CreateHierarchy>false</t:CreateHierarchy>
                        <t:Delete>true</t:Delete>
                        <t:Modify>true</t:Modify>
                        <t:Read>true</t:Read>
                     </t:EffectiveRights>
                     <t:LastModifiedName>Wendy Bakkertje</t:LastModifiedName>
*                    <t:LastModifiedTime>2016-03-08T11:11:56Z</t:LastModifiedTime>
                     <t:UID>040000[snip]CAFE1</t:UID>
                     <t:RecurrenceId>2016-03-08T11:20:00Z</t:RecurrenceId>
*                    <t:DateTimeStamp>2016-03-08T11:11:56Z</t:DateTimeStamp>
                     <t:Start>2016-03-08T11:20:00Z</t:Start>
                     <t:End>2016-03-08T11:50:00Z</t:End>
                     <t:OriginalStart>2016-03-08T11:20:00Z</t:OriginalStart>
                     <t:IsAllDayEvent>false</t:IsAllDayEvent>
                     <t:LegacyFreeBusyStatus>Busy</t:LegacyFreeBusyStatus>
                     <t:Location/>
                     <t:IsMeeting>false</t:IsMeeting>
                     <t:IsCancelled>false</t:IsCancelled>
                     <t:IsRecurring>true</t:IsRecurring>
                     <t:MeetingRequestWasSent>false</t:MeetingRequestWasSent>
                     <t:IsResponseRequested>true</t:IsResponseRequested>
                     <t:CalendarItemType>Occurrence</t:CalendarItemType>
                     <t:MyResponseType>Organizer</t:MyResponseType>
                     <t:Organizer>
                        <t:Mailbox>
                           <t:Name>Wendy Bakkertje</t:Name>
                           <t:EmailAddress>[email protected]</t:EmailAddress>
                           <t:RoutingType>SMTP</t:RoutingType>
                        </t:Mailbox>
                     </t:Organizer>
                     <t:Duration>PT30M</t:Duration>
                     <t:TimeZone>(UTC+01:00) Amsterdam, Berlijn, Bern, Rome, Stockholm, Wenen</t:TimeZone>
                     <t:AppointmentSequenceNumber>0</t:AppointmentSequenceNumber>
                     <t:AppointmentState>0</t:AppointmentState>
                  </t:CalendarItem>
               </m:Items>
            </m:GetItemResponseMessage>
         </m:ResponseMessages>
      </m:GetItemResponse>
   </s:Body>
</s:Envelope>

Appointment B

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
   <s:Header>
      <h:ServerVersionInfo MajorVersion="15" MinorVersion="0" MajorBuildNumber="1104" MinorBuildNumber="3" Version="V2_22" xmlns:h="http://schemas.microsoft.com/exchange/services/2006/types" xmlns="http://schemas.microsoft.com/exchange/services/2006/types" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
   </s:Header>
   <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <m:GetItemResponse xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages" xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">
         <m:ResponseMessages>
            <m:GetItemResponseMessage ResponseClass="Success">
               <m:ResponseCode>NoError</m:ResponseCode>
               <m:Items>
                  <t:CalendarItem>
*ChangeKey           <t:ItemId Id="AAMkAG[snip]t6QAAEA==" ChangeKey="DwAAABYAAACuuv05CWNWTKnqziXALsXrAACJ2zpS"/>
                     <t:ParentFolderId Id="AQMkAG[snip]AAAA=" ChangeKey="AQAAAA=="/>
                     <t:ItemClass>IPM.Appointment.Occurrence</t:ItemClass>
*                    <t:Subject>App B</t:Subject>
                     <t:Sensitivity>Normal</t:Sensitivity>
                     <t:Body BodyType="Text"/>
*                    <t:DateTimeReceived>2016-03-08T11:07:08Z</t:DateTimeReceived>
*                    <t:Size>5469</t:Size>
                     <t:Importance>Normal</t:Importance>
                     <t:IsSubmitted>false</t:IsSubmitted>
                     <t:IsDraft>false</t:IsDraft>
                     <t:IsFromMe>false</t:IsFromMe>
                     <t:IsResend>false</t:IsResend>
                     <t:IsUnmodified>false</t:IsUnmodified>
*                    <t:DateTimeSent>2016-03-08T11:07:08Z</t:DateTimeSent>
*                    <t:DateTimeCreated>2016-03-08T11:07:08Z</t:DateTimeCreated>
                     <t:ResponseObjects>
                        <t:ForwardItem/>
                     </t:ResponseObjects>
                     <t:ReminderDueBy>2016-03-08T11:20:00Z</t:ReminderDueBy>
                     <t:ReminderIsSet>true</t:ReminderIsSet>
                     <t:ReminderMinutesBeforeStart>10</t:ReminderMinutesBeforeStart>
                     <t:DisplayCc/>
                     <t:DisplayTo/>
                     <t:HasAttachments>false</t:HasAttachments>
                     <t:Culture>nl-NL</t:Culture>
                     <t:EffectiveRights>
                        <t:CreateAssociated>false</t:CreateAssociated>
                        <t:CreateContents>false</t:CreateContents>
                        <t:CreateHierarchy>false</t:CreateHierarchy>
                        <t:Delete>true</t:Delete>
                        <t:Modify>true</t:Modify>
                        <t:Read>true</t:Read>
                     </t:EffectiveRights>
                     <t:LastModifiedName>Wendy Bakkertje</t:LastModifiedName>
*                    <t:LastModifiedTime>2016-03-08T11:07:08Z</t:LastModifiedTime>
*                    <t:UID>040000[snip]463B</t:UID>
                     <t:RecurrenceId>2016-03-08T11:20:00Z</t:RecurrenceId>
*                    <t:DateTimeStamp>2016-03-08T11:07:08Z</t:DateTimeStamp>
                     <t:Start>2016-03-08T11:20:00Z</t:Start>
                     <t:End>2016-03-08T11:50:00Z</t:End>
                     <t:OriginalStart>2016-03-08T11:20:00Z</t:OriginalStart>
                     <t:IsAllDayEvent>false</t:IsAllDayEvent>
                     <t:LegacyFreeBusyStatus>Busy</t:LegacyFreeBusyStatus>
                     <t:Location/>
                     <t:IsMeeting>false</t:IsMeeting>
                     <t:IsCancelled>false</t:IsCancelled>
                     <t:IsRecurring>true</t:IsRecurring>
                     <t:MeetingRequestWasSent>false</t:MeetingRequestWasSent>
                     <t:IsResponseRequested>true</t:IsResponseRequested>
                     <t:CalendarItemType>Occurrence</t:CalendarItemType>
                     <t:MyResponseType>Organizer</t:MyResponseType>
                     <t:Organizer>
                        <t:Mailbox>
                           <t:Name>Wendy Bakkertje</t:Name>
                           <t:EmailAddress>[email protected]</t:EmailAddress>
                           <t:RoutingType>SMTP</t:RoutingType>
                        </t:Mailbox>
                     </t:Organizer>
                     <t:Duration>PT30M</t:Duration>
                     <t:TimeZone>(UTC+01:00) Amsterdam, Berlijn, Bern, Rome, Stockholm, Wenen</t:TimeZone>
                     <t:AppointmentSequenceNumber>0</t:AppointmentSequenceNumber>
                     <t:AppointmentState>0</t:AppointmentState>
                  </t:CalendarItem>
               </m:Items>
            </m:GetItemResponseMessage>
         </m:ResponseMessages>
      </m:GetItemResponse>
   </s:Body>
</s:Envelope>
1

1 Answers

1
votes

The Logic that is used for reminders is documented in https://msdn.microsoft.com/en-us/library/ee219839(v=exchg.80).aspx its relative complex and you'll need to use the extended properties to implement it fully. The other thing you can use in 2013 and up is EWS has a reminders operation https://msdn.microsoft.com/en-us/library/office/dn720424(v=exchg.150).aspx but Mapi clients like Outlook use the Reminders Search Folder in the Non_IPM_Subtree

Cheers Glen