すべての予定ごとに Guid を保存する必要があります。PolicyTag
andを使おうとしましArchiveTag
たが、
"プロパティ PolicyTag は、Exchange Exchange2013 以降のバージョンでのみ有効です。",
例外。
Exchange 2010 にも同様のものはありますか? 私が理解しているappointment.ID
ように、自己生成されたIDが含まれています。私はそれを使用しない方が好きです。ありがとうございました。
すべての予定ごとに Guid を保存する必要があります。PolicyTag
andを使おうとしましArchiveTag
たが、
"プロパティ PolicyTag は、Exchange Exchange2013 以降のバージョンでのみ有効です。",
例外。
Exchange 2010 にも同様のものはありますか? 私が理解しているappointment.ID
ように、自己生成されたIDが含まれています。私はそれを使用しない方が好きです。ありがとうございました。
この問題に対処する方法は、拡張プロパティを作成し、予定に 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;
}
このソリューションは、単一の予定の場合や、オンプレミス Exchange を使用する場合に非常にうまく機能します。ここでの問題は、Office 365 などのオンライン Web アクセス (OWA) での会議の場合です。予定のプロパティは、主催者からの元の予定からコピーされます。これらのプロパティの中には、AppoinmentID が含まれる拡張プロパティがあります。 . したがって、このトラブルを回避するために、出席者の予定 ID を主催者の元の ID に似たものにし、サービス所有者 (通知を作成したサービス) のメール アドレスを追加するだけです。このソリューションを使用しない場合、内部システムの予定は元の予約と同様の AppointmentID を持ち、1 つと見なされます。または、同じ ID を持つ異なる 2 つの予定がある可能性があります。
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
}
}