مدیریت تکرارها

کار با تکرارهای روزانه

Aspose.Email از ایجاد تکرارهای روزانه با استفاده از MapiCalendarDailyRecurrencePattern پشتیبانی می‌کند. می‌توان از سه نوع پایان تکرار مختلف تقویم Mapi استفاده کرد که شامل EndAfterNOccurrences، EndAfterDate و NeverEnd می‌باشد. این بخش ایجاد الگوهای مختلف تکرار روزانه را نشان می‌دهد.

تکرارهای روزانه با شمارش وقوع

در این نوع تکرار، تعداد تکرارها به همراه سایر اطلاعات به شرح زیر تنظیم می‌شود:

  1. تاریخ شروع، پایان و موعد را تنظیم کنید.
  2. یک MapiTask ایجاد کنید.
  3. وضعیت کار را به NotAssigned تنظیم کنید.
  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 Task با تنظیم ویژگی OccurrenceCount که توسط تابع GetOccurrenceCount() محاسبه می‌شود، به‌دست می‌آید. این تابع تاریخ شروع، تاریخ پایان و رشته RRULE را دریافت می‌کند.

تکرارهای روزانه: تنظیم مقدار Every Day

کد نمونه زیر نشان می‌دهد چگونه مقدار period را به 1 و مقدار INTERVAL را نیز در رشته RRULE به 1 تنظیم کنیم.

// 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. وضعیت کار را به NotAssigned تنظیم کنید.
  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 Task با تنظیم ویژگی OccurrenceCount که توسط تابع GetOccurrenceCount() محاسبه می‌شود، به‌دست می‌آید. این تابع تاریخ شروع، تاریخ پایان و رشته RRULE را دریافت می‌کند.

تکرارهای هفتگی: تنظیم مقدار Every Day

کد نمونه زیر نشان می‌دهد چگونه مقدار period را به 1 و مقدار INTERVAL را نیز در رشته RRULE به 1 تنظیم کنیم.

// 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. وضعیت کار را به NotAssigned تنظیم کنید.
  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 Task با تنظیم ویژگی OccurrenceCount که توسط تابع GetOccurrenceCount() محاسبه می‌شود، به‌دست می‌آید. این تابع تاریخ شروع، تاریخ پایان و رشته RRULE را دریافت می‌کند. قطعه کد زیر نشان می‌دهد چگونه یک تکرار در روز ۱۵ هر ماه بین تاریخ شروع و پایان ایجاد کنید.

// 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. وضعیت کار را به NotAssigned تنظیم کنید.
  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 Task با تنظیم ویژگی OccurrenceCount که توسط تابع GetOccurrenceCount() محاسبه می‌شود، به‌دست می‌آید. این تابع تاریخ شروع، تاریخ پایان و رشته RRULE را دریافت می‌کند. قطعه کد زیر نشان می‌دهد چگونه یک تکرار در روز ۱۵ هر ۷ ماه بین تاریخ شروع و پایان ایجاد کنید.

// 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,
};            

تولید تکرار از قاعده تکرار

API Aspose.Email قابلیت تولید الگوی تکرار از قانون تکرار (RRULE) را فراهم می‌کند. این API اطلاعات را طبق مشخصات iCal RFC 5545 از RRULE تجزیه‑تحلیل می‌کند و الگوی تکرار را با استفاده از متد 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);

افزودن پیوست به رویدادهای تقویم تکراری

API 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);
}