Search code examples
exchange-serverexchangewebservices

How to identify the same Exchange calendar events?


I use EWS to get data about user calendar events. I connect to MS Exchange on behalf of the user. If I connect as user B, how can I tell if I found the same calendar event which I found before in mailbox of user A? Maybe something like the same message identifier or something like that?


Solution

  • There's a few way you can do that the best way (which is the way Outlook uses) is to use the Goid properties eg GlobalCleanObjectId https://learn.microsoft.com/en-us/office/client-developer/outlook/mapi/pidlidcleanglobalobjectid-canonical-property a quick example

         Appointment newAppointment = new Appointment(service);
        newAppointment.Subject = "Test Subject";        
        newAppointment.Start = new DateTime(2012, 03, 27, 17, 00, 0);
        newAppointment.StartTimeZone = TimeZoneInfo.Local;
        newAppointment.EndTimeZone = TimeZoneInfo.Local;
        newAppointment.End = newAppointment.Start.AddMinutes(30);
        newAppointment.Save();
        newAppointment.Body = new MessageBody(Microsoft.Exchange.WebServices.Data.BodyType.Text, "test");
        newAppointment.RequiredAttendees.Add("attendee@domain.com");
        newAppointment.Update(ConflictResolutionMode.AlwaysOverwrite ,SendInvitationsOrCancellationsMode.SendOnlyToAll);
        ExtendedPropertyDefinition CleanGlobalObjectId = new ExtendedPropertyDefinition(DefaultExtendedPropertySet.Meeting, 0x23, MapiPropertyType.Binary);
        PropertySet psPropSet = new PropertySet(BasePropertySet.FirstClassProperties);
        psPropSet.Add(CleanGlobalObjectId);
        newAppointment.Load(psPropSet);
        object CalIdVal = null;
        newAppointment.TryGetProperty(CleanGlobalObjectId, out CalIdVal);
        Folder AtndCalendar = Folder.Bind(service, new FolderId(WellKnownFolderName.Calendar,"attendee@domain.com"));
        SearchFilter sfSearchFilter = new SearchFilter.IsEqualTo(CleanGlobalObjectId, Convert.ToBase64String((Byte[])CalIdVal));
        ItemView ivItemView = new ItemView(1);
        FindItemsResults<Item> fiResults = AtndCalendar.FindItems(sfSearchFilter, ivItemView);
        if (fiResults.Items.Count > 0) {
            //do whatever
        }