3

我需要为每个约会保存一个指导。我尝试使用PolicyTagand ArchiveTag,但得到了 ,

"属性 PolicyTag 仅对 Exchange Exchange2013 或更高版本有效。",

例外。

Exchange 2010 有类似的东西吗?据我了解appointment.ID,其中包含自生成的 id。我宁愿不使用它。谢谢你。

4

1 回答 1

4

解决此问题的一种方法是创建一个扩展属性,并为约会放置 guid,除非您从另一个约会中复制它,否则它不会改变(毕竟它只是一个属性)

private static readonly PropertyDefinitionBase AppointementIdPropertyDefinition = new ExtendedPropertyDefinition(DefaultExtendedPropertySet.PublicStrings, "AppointmentID", MapiPropertyType.String);
public static PropertySet PropertySet = new PropertySet(BasePropertySet.FirstClassProperties, AppointementIdPropertyDefinition);


//Setting the property for the appointment 
 public static void SetGuidForAppointement(Appointment appointment)
{
    try
    {
        appointment.SetExtendedProperty((ExtendedPropertyDefinition)AppointementIdPropertyDefinition, Guid.NewGuid().ToString());
        appointment.Update(ConflictResolutionMode.AlwaysOverwrite, SendInvitationsOrCancellationsMode.SendToNone);
    }
    catch (Exception ex)
    {
        // logging the exception
    }
}

//Getting the property for the appointment
 public static string GetGuidForAppointement(Appointment appointment)
{
    var result = "";
    try
    {
        appointment.Load(PropertySet);
        foreach (var extendedProperty in appointment.ExtendedProperties)
        {
            if (extendedProperty.PropertyDefinition.Name == "AppointmentID")
            {
                result = extendedProperty.Value.ToString();
            }
        }
    }
    catch (Exception ex)
    {
     // logging the exception
    }
    return result;
} 

此解决方案在单个约会和使用 On Premises Exchange 的情况下非常有效。这里的问题是在线 Web 访问 (OWA) 中的会议,例如 Office 365,约会的属性是从组织者的原始约会中复制的,这些属性中有 AppoinmentID 是其中的扩展属性. 因此,为了避免这种麻烦,我们在组织者中将参加者的约会 id 设置为与原始的相似,并添加服务所有者(产生通知的服务)的电子邮件地址。如果没有这个解决方案,内部系统中的约会将具有与原始预订相似的 AppointmentID 并被视为一个,或者您可能有两个具有相同 ID 的不同约会。

 private static void SetGuidForMeetingAppiontment(Appointment appointment)
        {
            var log = "";

            try
            {
                if (!appointment.IsMeeting) return;
                if (appointment.Service.ImpersonatedUserId == null) return;

                /*
                 * The only tricky case is that if the appointment is created at the attendee with no Guid.
                 * In this case the application should look for the original appointment from the organizer's side, and get its guid, to paste it in the new booking 
                 * from the attendee side, and add the attendee emailAddress. 
                 */
                if (GetGuidForMeetingAppointement(appointment).Length <= 36)
                {
                    // If it was an attendee, then look for the original appointment from the organizer's service
                    if (appointment.Service.ImpersonatedUserId.Id != appointment.Organizer.Address)
                    {

                        log += "1/5 Getting the original event of the meeting\n";
                        if (ExchangeLiteService.Services.ContainsKey(appointment.Organizer.Address))
                        {
                            //  FindItemsResults<Appointment> originalAppointments;
                            var originalAppointments = ExchangeLiteService.Services[appointment.Organizer.Address].FindAppointments(WellKnownFolderName.Calendar, new CalendarView(appointment.Start, appointment.End, 1));
                            if (originalAppointments == null) return; //there must be an original appointment. 
                            if (!originalAppointments.Any()) return; //there must be an original appointment. 
                            var originalAppointment = originalAppointments.First(); // there should be only one appointment at a specifict time and date. 

                            log += "2/5 Getting the Guid for the original event of the meeting\n";
                            var originalAppointmentID = GetGuidForMeetingAppointement(originalAppointment);
                            if (string.IsNullOrEmpty(originalAppointmentID)) return; // the original appointment must have a guid already.

                            var orignalAppointmentIDGuid = originalAppointmentID.Substring(0, 36);

                            log += "3/5 Attaching the email address to the guid extracted\n";
                            var newAppointmentID = orignalAppointmentIDGuid + "_" + appointment.Service.ImpersonatedUserId.Id;

                            log += "4/5 Setting the new Guid to the meeting appointment\n";
                            appointment.SetExtendedProperty((ExtendedPropertyDefinition)AppointementIdPropertyDefinition, newAppointmentID);

                            log += "5/5 Updateing the meeting appointment\n";
                            appointment.Update(ConflictResolutionMode.AlwaysOverwrite, SendInvitationsOrCancellationsMode.SendToNone);
                        }
                        else //Then the user is invited from an organizer outside the system.
                        {
                            // Delete if there are anything similar 
                            ExchangeLiteService.OnCallDeleteBookingFromInternal(appointment.Service.ImpersonatedUserId.Id, appointment.Start, appointment.End);

                            //Assign a new 
                            var appointmentIDGuid = Guid.NewGuid().ToString();
                            var newAppointmentID = appointmentIDGuid + "_" + appointment.Service.ImpersonatedUserId.Id;
                            appointment.SetExtendedProperty((ExtendedPropertyDefinition)AppointementIdPropertyDefinition, newAppointmentID);
                            appointment.Update(ConflictResolutionMode.AlwaysOverwrite, SendInvitationsOrCancellationsMode.SendToNone);

                        }
                        //Get only the guid part of it (without the address of the organizer) 
                    }
                    else // if he was the organizer 
                    {
                        log += "If it was new meeting appointment and the notification from the organizer\n";
                        var appointmentIDGuid = Guid.NewGuid().ToString();
                        var newAppointmentID = appointmentIDGuid + "_" + appointment.Service.ImpersonatedUserId.Id;
                        appointment.SetExtendedProperty((ExtendedPropertyDefinition)AppointementIdPropertyDefinition, newAppointmentID);
                        appointment.Update(ConflictResolutionMode.AlwaysOverwrite, SendInvitationsOrCancellationsMode.SendToNone);
                    }
                }
                else
                {
                    log += "If it was an updated meeting appointment and has Guid already\n";
                    var appointmentID = GetGuidForMeetingAppointement(appointment);
                    var appointmentIDGuid = appointmentID.Substring(0, 36);
                    var newAppointmentID = appointmentIDGuid + "_" + appointment.Service.ImpersonatedUserId.Id;
                    appointment.SetExtendedProperty((ExtendedPropertyDefinition)AppointementIdPropertyDefinition, newAppointmentID);
                    appointment.Update(ConflictResolutionMode.AlwaysOverwrite, SendInvitationsOrCancellationsMode.SendToNone);
                }
            }
            catch (Exception ex)
            {
                //Logging the exception
            }

        }
于 2013-02-12T12:30:42.983 回答