إدارة التكرارات

Contents
[ ]

العمل مع التكرارات اليومية

يدعم Aspose.Email إنشاء التكرارات اليومية باستخدام MapiCalendarDailyRecurrencePattern. يمكن استخدام ثلاثة أنواع مختلفة من نهايات تكرار تقويم Mapi بما في ذلك EndAfterNOccurrences و EndAfterDate و NeverEnd. يوضح هذا القسم إنشاء أنماط تكرار يومية مختلفة.

التكرارات اليومية مع عدد الحدوث

في هذا النوع من التكرارات، يجب تعيين عدد التكرارات إلى جانب المعلومات الأخرى كما يلي:

  1. عيّن تاريخ البدء، الانتهاء وتاريخ الاستحقاق.
  2. إنشاء مهمة MapiTask.
  3. تعيين حالة المهمة إلى غير مخصص.
  4. أنشئ كائن التكرار اليومي عن طريق ضبط الخصائص مثل PatternType و Period و WeekStartDay و EndType و OccurenceCount.
  5. عيّن خاصية MapiTask.Recurrence إلى كائن التكرار اليومي هذا.
  6. احفظ هذه الرسالة على القرص.

يُظهر مقطع الشيفرة التالي كيفية إنشاء مهمة بنوع انتهاء التكرار EndAfterNOccurrence.

// The path to the File directory.
string dataDir = RunExamples.GetDataDir_Outlook();

TimeZone localZone = TimeZone.CurrentTimeZone;
TimeSpan timeSpan = localZone.GetUtcOffset(DateTime.Now);
DateTime StartDate = new DateTime(2015, 7, 16);
StartDate = StartDate.Add(timeSpan);

DateTime DueDate = new DateTime(2015, 7, 16);
DateTime endByDate = new DateTime(2015, 8, 1);
DueDate = DueDate.Add(timeSpan);
endByDate = endByDate.Add(timeSpan);
 
MapiTask task = new MapiTask("This is test task", "Sample Body", StartDate, DueDate);
task.State = MapiTaskState.NotAssigned;

// Set the Daily recurrence
var rec = new MapiCalendarDailyRecurrencePattern
{
    PatternType = MapiCalendarRecurrencePatternType.Day,
    Period = 1,
    WeekStartDay = DayOfWeek.Sunday,
    EndType = MapiCalendarRecurrenceEndType.EndAfterNOccurrences,
    OccurrenceCount = GetOccurrenceCount(StartDate, endByDate, "FREQ=DAILY"),
};

if (rec.OccurrenceCount==0)
{
    rec.OccurrenceCount = 1;
}

task.Recurrence = rec;
task.Save(dataDir + "Daily_out.msg", TaskSaveFormat.Msg);

يمكن استخدام الدالة التالية لحساب عدد الأحداث بين التاريخين:

private static uint GetOccurrenceCount(DateTime start, DateTime endBy, string rrule)
{
    CalendarRecurrence pattern = new CalendarRecurrence(string.Format("DTSTART:{0}\r\nRRULE:{1}", start.ToString("yyyyMMdd"), rrule));
    DateCollection dates = pattern.GenerateOccurrences(start, endBy);
    return (uint)dates.Count;
}

تعيين قيمة عدد التكرارات

يوضح مقتطف الشيفرة التالي كيفية تعيين قيمة عدد التكرارات.

// Set the Daily recurrence
var record = new MapiCalendarDailyRecurrencePattern
{
    PatternType = MapiCalendarRecurrencePatternType.Day,
    Period = 1,
    WeekStartDay = DayOfWeek.Sunday,
    EndType = MapiCalendarRecurrenceEndType.EndAfterNOccurrences,
    OccurrenceCount = 5,
};
task.Recurrence = record;

التكرارات اليومية: نوع النهاية EndAfterDate

"End By" يُتحقق في مهمة Mapi عن طريق تعيين خاصية OccurrenceCount التي يتم حسابها بواسطة الدالة GetOccurrenceCount(). تأخذ هذه الدالة تاريخ البدء، تاريخ الانتهاء وسلسلة RRULE.

التكرارات اليومية: تعيين قيمة كل يوم

يوضح مقتطف الشيفرة التالي كيفية تعيين قيمة الفترة إلى 1 وقيمة INTERVAL إلى 1 في سلسلة RRULE كذلك.

// Set the Daily recurrence
var record = new MapiCalendarDailyRecurrencePattern
{
    PatternType = MapiCalendarRecurrencePatternType.Day,
    Period = 1,
    EndType = MapiCalendarRecurrenceEndType.EndAfterDate,
    OccurrenceCount = GetOccurrenceCount(StartDate, endByDate, "FREQ=DAILY;INTERVAL=1"),
    EndDate = endByDate
};

يمكن تعيين قيمة Every Day إلى أي قيمة مناسبة كما هو موضح في المثال التالي:


// Set the Daily recurrence
var record = new MapiCalendarDailyRecurrencePattern
{
	PatternType = MapiCalendarRecurrencePatternType.Day,
	Period = 2,
	EndType = MapiCalendarRecurrenceEndType.EndAfterDate,
	OccurrenceCount = GetOccurrenceCount(StartDate, endByDate, "FREQ=DAILY;INTERVAL=2"),
};

التكرارات اليومية: نوع النهاية NeverEnd

يمكن تعيين نوع النهاية باستخدام MapiCalendarRecurrenceEndType.NeverEnd. يمكن تعيين Period أو INTERVAL إلى القيمة المطلوبة مثل 1 في المثال التالي.

// Set the Daily recurrence
var record = new MapiCalendarDailyRecurrencePattern
{
    PatternType = MapiCalendarRecurrencePatternType.Day,
    Period = 1,
    EndType = MapiCalendarRecurrenceEndType.NeverEnd,
};

العمل مع التكرارات الأسبوعية

يوفر Aspose.Email ميزات غنية لإنشاء تكرارات أسبوعية باستخدام MapiCalendarWeeklyRecurrencePattern. يمكن استخدام ثلاثة أنواع مختلفة من نهايات تكرار تقويم Mapi بما في ذلك EndAfterNOccurrences و EndAfterDate و NeverEnd. يوضح هذا القسم إنشاء أنماط تكرار أسبوعية مختلفة.

التكرارات الأسبوعية: نوع النهاية EndAfterNOccurrences

في هذا النوع من التكرارات، يجب تعيين عدد التكرارات إلى جانب المعلومات الأخرى كما يلي:

  1. عيّن تاريخ البدء، الانتهاء وتاريخ الاستحقاق.
  2. إنشاء مهمة MapiTask.
  3. تعيين حالة المهمة إلى غير مخصص.
  4. أنشئ كائن التكرار الأسبوعي عن طريق ضبط الخصائص مثل PatternType و Period و WeekStartDay و EndType و OccurenceCount.
  5. عيّن خاصية MapiTask.Recurrence إلى كائن التكرار الأسبوعي هذا.
  6. احفظ هذه الرسالة على القرص.

يوضح مقطع الكود التالي كيفية إنشاء مهمة بنوع نهاية تكرار EndAfterNOccurrence.

// The path to the File directory.
string dataDir = RunExamples.GetDataDir_Outlook();
TimeZone localZone = TimeZone.CurrentTimeZone;
TimeSpan ts = localZone.GetUtcOffset(DateTime.Now);
DateTime StartDate = new DateTime(2015, 7, 16);
StartDate = StartDate.Add(ts);

DateTime DueDate = new DateTime(2015, 7, 16);
DateTime endByDate = new DateTime(2015, 9, 1);
DueDate = DueDate.Add(ts);
endByDate = endByDate.Add(ts);

MapiTask task = new MapiTask("This is test task", "Sample Body", StartDate, DueDate);
task.State = MapiTaskState.NotAssigned;

// Set the weekly recurrence
var rec = new MapiCalendarWeeklyRecurrencePattern
{
    EndType = MapiCalendarRecurrenceEndType.EndAfterNOccurrences,
    PatternType = MapiCalendarRecurrencePatternType.Week,
    Period = 1,
    WeekStartDay = DayOfWeek.Sunday,
    DayOfWeek = MapiCalendarDayOfWeek.Friday,
    OccurrenceCount = GetOccurrenceCount(StartDate, endByDate, "FREQ=WEEKLY;BYDAY=FR"),
};

if (rec.OccurrenceCount == 0)
{
    rec.OccurrenceCount = 1;
}

task.Recurrence = rec;
task.Save(dataDir + "Weekly_out.msg", TaskSaveFormat.Msg);

يمكن استخدام الدالة التالية لحساب عدد الأحداث بين التاريخين:

private static uint GetOccurrenceCount(DateTime start, DateTime endBy, string rrule)
{            
    CalendarRecurrence pattern = new CalendarRecurrence(string.Format("DTSTART:{0}\r\nRRULE:{1}", start.ToString("yyyyMMdd"),rrule));            
    DateCollection dates = pattern.GenerateOccurrences(start, endBy);            
    return (uint)dates.Count;
}

اختيار أيام متعددة في الأسبوع

يوضح مقتطف الشيفرة التالي كيفية اختيار أيام متعددة في الأسبوع.

// Set the weekly recurrence
var rec = new MapiCalendarWeeklyRecurrencePattern
{
    EndType = MapiCalendarRecurrenceEndType.EndAfterNOccurrences,
    PatternType = MapiCalendarRecurrencePatternType.Week,
    Period = 1,
    WeekStartDay = DayOfWeek.Sunday,
    DayOfWeek = MapiCalendarDayOfWeek.Friday | MapiCalendarDayOfWeek.Monday,
    OccurrenceCount = GetOccurrenceCount(StartDate, endByDate, "FREQ=WEEKLY;BYDAY=FR,MO"),
};

اختيار أيام متعددة في الأسبوع وتعيين الفواصل

يوضح مقتطف الشيفرة التالي كيفية اختيار أيام متعددة في الأسبوع وتعيين الفواصل.

// Set the weekly recurrence
var rec = new MapiCalendarWeeklyRecurrencePattern
{
    EndType = MapiCalendarRecurrenceEndType.EndAfterNOccurrences,
    PatternType = MapiCalendarRecurrencePatternType.Week,
    Period = 2,
    WeekStartDay = DayOfWeek.Sunday,
    DayOfWeek = MapiCalendarDayOfWeek.Friday | MapiCalendarDayOfWeek.Monday,
    OccurrenceCount = GetOccurrenceCount(StartDate, endByDate, "FREQ=WEEKLY;BYDAY=FR,MO;INTERVAL=2"),
};

التكرارات الأسبوعية: نوع النهاية EndAfterDate

"End By" يُتحقق في مهمة Mapi عن طريق تعيين خاصية OccurrenceCount التي يتم حسابها بواسطة الدالة GetOccurrenceCount(). تأخذ هذه الدالة تاريخ البدء، تاريخ الانتهاء وسلسلة RRULE.

التكرارات الأسبوعية: تعيين قيمة كل يوم

يوضح مقتطف الشيفرة التالي كيفية تعيين قيمة الفترة إلى 1 وقيمة INTERVAL إلى 1 في سلسلة RRULE كذلك.

// Set the weekly recurrence
var rec = new MapiCalendarWeeklyRecurrencePattern
{
    EndType = MapiCalendarRecurrenceEndType.EndAfterDate,
    PatternType = MapiCalendarRecurrencePatternType.Week,
    Period = 1,
    WeekStartDay = DayOfWeek.Sunday,
    DayOfWeek = MapiCalendarDayOfWeek.Friday,
    EndDate = endByDate,
    OccurrenceCount = GetOccurrenceCount(StartDate, endByDate, "FREQ=WEEKLY;BYDAY=FR;INTERVAL=1"),
};

يمكن تعيين قيمة Every Day إلى أي قيمة مناسبة ويمكن اختيار أيام متعددة كما هو موضح في المثال التالي:

var record = new MapiCalendarWeeklyRecurrencePattern
{
    EndType = MapiCalendarRecurrenceEndType.EndAfterDate,
    PatternType = MapiCalendarRecurrencePatternType.Week,
    Period = 2,
    WeekStartDay = DayOfWeek.Sunday,
    EndDate = endByDate,
    DayOfWeek = MapiCalendarDayOfWeek.Friday | MapiCalendarDayOfWeek.Monday,
    OccurrenceCount = GetOccurrenceCount(StartDate, endByDate, "FREQ=WEEKLY;BYDAY=FR,MO;INTERVAL=2"),
};

التكرارات الأسبوعية: نوع النهاية NeverEnd

يمكن تعيين نوع النهاية باستخدام MapiCalendarRecurrenceEndType.NeverEnd. يمكن تعيين Period أو INTERVAL إلى القيمة المطلوبة مثل 1 في المثال التالي.

// Set the weekly recurrence
var recurrence = new MapiCalendarWeeklyRecurrencePattern
{
    EndType = MapiCalendarRecurrenceEndType.NeverEnd,
    PatternType = MapiCalendarRecurrencePatternType.Week,
    Period = 1,
    WeekStartDay = DayOfWeek.Sunday,
    DayOfWeek = MapiCalendarDayOfWeek.Friday,
    OccurrenceCount = GetOccurrenceCount(StartDate, endByDate, "FREQ=WEEKLY;BYDAY=FR"),
};

العمل مع التكرارات الشهرية

يدعم Aspose.Email إنشاء تكرارات شهرية باستخدام MapiCalendarMonthlyRecurrencePattern. يمكن استخدام ثلاثة أنواع مختلفة من نهايات تكرار تقويم Mapi بما في ذلك EndAfterNOccurrences و EndAfterDate و NeverEnd. يوضح هذا القسم إنشاء أنماط تكرار شهرية مختلفة.

التكرارات الشهرية: نوع النهاية EndAfterNOccurrences

في هذا النوع من التكرارات، يجب تعيين عدد التكرارات إلى جانب المعلومات الأخرى كما يلي:

  1. عيّن تاريخ البدء، الانتهاء وتاريخ الاستحقاق.
  2. إنشاء مهمة MapiTask.
  3. تعيين حالة المهمة إلى غير مخصص.
  4. أنشئ كائن التكرار الشهري عن طريق ضبط الخصائص مثل PatternType و Period و WeekStartDay و EndType و OccurenceCount.
  5. عيّن خاصية MapiTask.Recurrence إلى كائن التكرار الشهري هذا.
  6. احفظ هذه الرسالة على القرص.

يوضح مقطع الكود التالي كيفية إنشاء مهمة بنوع نهاية تكرار EndAfterNOccurrence.

// The path to the File directory.
string dataDir = RunExamples.GetDataDir_Outlook();
TimeZone localZone = TimeZone.CurrentTimeZone;
TimeSpan ts = localZone.GetUtcOffset(DateTime.Now);
DateTime StartDate = new DateTime(2015, 7, 16);
StartDate = StartDate.Add(ts);

DateTime DueDate = new DateTime(2015, 7, 16);
DateTime endByDate = new DateTime(2015, 12, 31);
DueDate = DueDate.Add(ts);
endByDate = endByDate.Add(ts);

MapiTask task = new MapiTask("This is test task", "Sample Body", StartDate, DueDate);
task.State = MapiTaskState.NotAssigned;

// Set the Monthly recurrence
var rec = new MapiCalendarMonthlyRecurrencePattern
{
    Day = 15,
    Period = 1,
    PatternType = MapiCalendarRecurrencePatternType.Month,
    EndType = MapiCalendarRecurrenceEndType.EndAfterNOccurrences,
    OccurrenceCount = GetOccurrenceCount(StartDate, endByDate, "FREQ=MONTHLY;BYMONTHDAY=15;INTERVAL=1"),
    WeekStartDay = DayOfWeek.Monday,

};

if (rec.OccurrenceCount == 0)
{
    rec.OccurrenceCount = 1;
}

task.Recurrence = rec;
//task.Save(dataDir + "Monthly_out.msg", TaskSaveFormat.Msg);

يمكن استخدام الدالة التالية لحساب عدد الأحداث بين التاريخين:

private static uint GetOccurrenceCount(DateTime start, DateTime endBy, string rrule)
{
    CalendarRecurrence pattern = new CalendarRecurrence(string.Format("DTSTART:{0}\r\nRRULE:{1}", start.ToString("yyyyMMdd"), rrule));
    DateCollection dates = pattern.GenerateOccurrences(start, endBy);       
    return (uint)dates.Count;
}

تعيين عدد ثابت من التكرارات

يوضح مقطع الكود التالي كيفية تعيين عدد ثابت من التكرارات.

// Set the Monthly recurrence
var records = new MapiCalendarMonthlyRecurrencePattern
{
    Day = 15,
    Period = 1,
    PatternType = MapiCalendarRecurrencePatternType.Month,
    EndType = MapiCalendarRecurrenceEndType.EndAfterNOccurrences,
    OccurrenceCount = 5,
    WeekStartDay = DayOfWeek.Monday
};

التكرارات الشهرية: نوع النهاية EndAfterDate

"End By" يُتحقق في مهمة Mapi عن طريق تعيين خاصية OccurrenceCount التي يتم حسابها بواسطة الدالة GetOccurrenceCount(). تأخذ هذه الدالة تاريخ البدء، تاريخ الانتهاء وسلسلة RRULE. يوضح مقطع الكود التالي كيفية إنشاء تكرار في اليوم الـ 15 من كل شهر بين تاريخي البدء والانتهاء.

// The path to the File directory.
string dataDir = RunExamples.GetDataDir_Outlook();

TimeZone localZone = TimeZone.CurrentTimeZone;
TimeSpan ts = localZone.GetUtcOffset(DateTime.Now);
DateTime StartDate = new DateTime(2015, 7, 1);
StartDate = StartDate.Add(ts);

DateTime DueDate = new DateTime(2015, 7, 1);
DateTime endByDate = new DateTime(2015, 12, 31);
DueDate = DueDate.Add(ts);
endByDate = endByDate.Add(ts);

MapiTask task = new MapiTask("This is test task", "Sample Body", StartDate, DueDate);
task.State = MapiTaskState.NotAssigned;

// Set the Monthly recurrence
var recurrence = new MapiCalendarMonthlyRecurrencePattern
{
    Day = 15,
    Period = 1,
    PatternType = MapiCalendarRecurrencePatternType.Month,
    EndType = MapiCalendarRecurrenceEndType.EndAfterDate,
    OccurrenceCount = GetOccurrenceCount(StartDate, endByDate, "FREQ=MONTHLY;BYMONTHDAY=15;INTERVAL=1"),
    WeekStartDay = DayOfWeek.Monday,
    EndDate = endByDate
};

task.Recurrence = recurrence;
//task.Save(dataDir + "SetMonthlyEndAfterDateRecurrence_out.msg", TaskSaveFormat.Msg);

التكرارات الشهرية: نوع النهاية NeverEnd

يوضح مقطع الكود التالي كيفية تعيين نوع النهاية باستخدام MapiCalendarRecurrenceEndType.NeverEnd.

var recurrence = new MapiCalendarMonthlyRecurrencePattern
{
    Day = 15,
    Period = 1,
    PatternType = MapiCalendarRecurrencePatternType.Month,
    EndType = MapiCalendarRecurrenceEndType.NeverEnd,
    WeekStartDay = DayOfWeek.Monday,
};

العمل مع التكرارات السنوية

يدعم Aspose.Email إنشاء تكرارات سنوية باستخدام MapiCalendarMonthlyRecurrencePattern. من خلال تعيين خاصية period إلى 12، يمكننا تحقيق نمط التكرار السنوي. يمكن استخدام ثلاثة أنواع مختلفة من نهايات تكرار تقويم Mapi بما في ذلك EndAfterNOccurrences و EndAfterDate و NeverEnd. يوضح هذا القسم إنشاء أنماط تكرار سنوية مختلفة.

التكرارات السنوية: نوع النهاية EndAfterNOccurrences

في هذا النوع من التكرارات، يجب تعيين عدد التكرارات إلى جانب المعلومات الأخرى كما يلي:

  1. عيّن تاريخ البدء، الانتهاء وتاريخ الاستحقاق.
  2. إنشاء مهمة MapiTask.
  3. تعيين حالة المهمة إلى غير مخصص.
  4. أنشئ كائن التكرار الشهري عن طريق ضبط الخصائص مثل PatternType و Period و WeekStartDay و EndType و OccurenceCount.
  5. عيّن خاصية MapiTask.Recurrence إلى كائن التكرار الشهري هذا لتحقيق التكرار السنوي.
  6. احفظ هذه الرسالة على القرص.

يوضح مقطع الكود التالي كيفية إنشاء مهمة بنوع نهاية تكرار EndAfterNOccurrence.


TimeZone localZone = TimeZone.CurrentTimeZone;
TimeSpan ts = localZone.GetUtcOffset(DateTime.Now);
DateTime StartDate = new DateTime(2015, 7, 1);
StartDate = StartDate.Add(ts);
DateTime DueDate = new DateTime(2015, 7, 1);
DateTime endByDate = new DateTime(2020, 12, 31);
DueDate = DueDate.Add(ts);
endByDate = endByDate.Add(ts);
MapiTask task = new MapiTask("This is test task", "Sample Body", StartDate, DueDate);
task.State = MapiTaskState.NotAssigned;

// Set the Yearly recurrence
var recurrence = new MapiCalendarMonthlyRecurrencePattern
{
	Day = 15,
	Period = 12,
	PatternType = MapiCalendarRecurrencePatternType.Month,
	EndType = MapiCalendarRecurrenceEndType.EndAfterNOccurrences,
	OccurrenceCount = 3,
};
task.Recurrence = recurrence;
task.Save("Yearly.msg", TaskSaveFormat.Msg);

التكرارات السنوية: نوع النهاية EndAfterDate

"End By" يُتحقق في مهمة Mapi عن طريق تعيين خاصية OccurrenceCount التي يتم حسابها بواسطة الدالة GetOccurrenceCount(). تأخذ هذه الدالة تاريخ البدء، تاريخ الانتهاء وسلسلة RRULE. يوضح مقطع الكود التالي كيفية إنشاء تكرار في اليوم الـ 15 من كل شهر سابع بين تاريخي البدء والانتهاء.

// Set the Yearly recurrence
var rec = new MapiCalendarMonthlyRecurrencePattern
{
    Day = 15,
    Period = 12,
    PatternType = MapiCalendarRecurrencePatternType.Month,
    EndType = MapiCalendarRecurrenceEndType.EndAfterDate,
    EndDate = endByDate,
    OccurrenceCount = GetOccurrenceCount(StartDate, endByDate, "FREQ=YEARLY;BYMONTHDAY=15;BYMONTH=7;INTERVAL=1"),
};
task.Recurrence = rec;

التكرارات السنوية: نوع النهاية NeverEnd

يوضح مقطع الكود التالي كيفية تعيين نوع النهاية باستخدام MapiCalendarRecurrenceEndType.NeverEnd.

// Set the Yearly recurrence
var recurrence = new MapiCalendarMonthlyRecurrencePattern
{
    Day = 15,
    Period = 12,
    PatternType = MapiCalendarRecurrencePatternType.Month,
    EndType = MapiCalendarRecurrenceEndType.NeverEnd,
};            

إنشاء تكرار من قاعدة التكرار

توفر Aspose.Email API القدرة على إنشاء نمط تكرار من قاعدة التكرار (RRULE). تقوم بتحليل المعلومات من RRULE وفقًا لمواصفات iCal RFC 5545 وتوليد نمط التكرار باستخدام الطريقة MapiCalendarRecurrencePatternFactory.FromString. يوضح مقطع الكود التالي كيفية توليد نمط التكرار من قاعدة التكرار.

// The path to the File directory.
string dataDir = RunExamples.GetDataDir_Outlook();

DateTime startDate = new DateTime(2015, 7, 16);
DateTime endDate = new DateTime(2015, 8, 1);
MapiCalendar app1 = new MapiCalendar("test location", "test summary", "test description", startDate, endDate);

app1.StartDate = startDate;
app1.EndDate = endDate;

string pattern = "DTSTART;TZID=Europe/London:20150831T080000\r\nDTEND;TZID=Europe/London:20150831T083000\r\nRRULE:FREQ=DAILY;INTERVAL=1;COUNT=7\r\nEXDATE:20150831T070000Z,20150904T070000Z";
app1.Recurrence.RecurrencePattern = MapiCalendarRecurrencePatternFactory.FromString(pattern);

إضافة مرفق إلى أحداث التقويم المتكررة

توفر واجهة برمجة تطبيقات Aspose.Email القدرة على إضافة مرفقات إلى أحداث التقويم المتكررة.

DateTime startDate = new DateTime(2018, 7, 19).AddHours(12);
MapiCalendar calendar = new MapiCalendar("location1", "summary1", "description1", startDate, startDate.AddHours(1));

MapiCalendarEventRecurrence recurrence = new MapiCalendarEventRecurrence();
MapiCalendarRecurrencePattern pattern = recurrence.RecurrencePattern = new MapiCalendarDailyRecurrencePattern();
pattern.PatternType = MapiCalendarRecurrencePatternType.Day;
pattern.Period = 1;
pattern.EndType = MapiCalendarRecurrenceEndType.NeverEnd;

DateTime exceptionDate = startDate.AddDays(3);
MapiCalendarExceptionInfo exception = new MapiCalendarExceptionInfo
{
    Location = "exceptionLoc",
    Subject = "exceptionSubj",
    Body = "exceptionBody",
    OriginalStartDate = exceptionDate,
    StartDateTime = exceptionDate,
    EndDateTime = exceptionDate.AddHours(5),
    Attachments = new MapiAttachmentCollection(calendar)
};
exception.Attachments.Add("file.txt", Encoding.ASCII.GetBytes("hello, world!"));

pattern.Exceptions.Add(exception);
pattern.ModifiedInstanceDates.Add(exceptionDate);
pattern.DeletedInstanceDates.Add(exceptionDate);
calendar.Recurrence = recurrence;

using (var newPst = PersonalStorage.Create(dataDir + "AddAttachmentToMapiExceptionInfo.pst", FileFormatVersion.Unicode))
{
    var newFolder = newPst.CreatePredefinedFolder("Calendar", StandardIpmFolder.Appointments);
    newFolder.AddMapiMessageItem(calendar);
}