Zarządzanie powtórzeniami

Praca z codziennymi powtórzeniami

Aspose.Email obsługuje tworzenie codziennych powtórzeń przy użyciu MapiCalendarDailyRecurrencePattern. Można użyć trzech różnych typów zakończenia powtórzenia kalendarza Mapi, w tym EndAfterNOccurrences, EndAfterDate i NeverEnd. Ta sekcja demonstruje tworzenie różnych codziennych wzorców powtórzeń.

Codzienne powtarzanie z liczbą wystąpień

W tym typie powtórzenia liczba powtórzeń powinna być ustawiona wraz z innymi informacjami, jak poniżej:

  1. Ustaw daty początkową, końcową i termin realizacji.
  2. Utwórz MapiTask.
  3. Ustaw stan zadania na NotAssigned.
  4. Utwórz obiekt dziennego powtórzenia, ustawiając właściwości takie jak PatternType, Period, WeekStartDay, EndType oraz OccurenceCount.
  5. Ustaw właściwość MapiTask.Recurrence na ten obiekt dziennego powtórzenia.
  6. Zapisz tę wiadomość na dysku.

Poniższy fragment kodu pokazuje, jak utworzyć zadanie z typem zakończenia powtórzeń 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);

Poniższa funkcja może być użyta do obliczenia liczby zdarzeń pomiędzy dwoma datami:

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

Ustawianie wartości liczby wystąpień

Poniższy fragment kodu pokazuje, jak ustawić wartość liczby wystąpień.

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

Dzienne powtarzania: typ EndAfterDate

Opcja "End By" w zadaniu Mapi jest realizowana poprzez ustawienie właściwości OccurrenceCount, obliczanej przez funkcję GetOccurrenceCount(). Funkcja ta przyjmuje datę początkową, datę końcową oraz ciąg RRULE.

Codzienne powtórzenia: Ustawianie wartości Każdy Dzień

Poniższy fragment kodu pokazuje, jak ustawić wartość period na 1 oraz wartość INTERVAL na 1 w ciągu 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
};

Wartość Every Day można ustawić na dowolną odpowiednią wartość, jak pokazano w poniższym przykładzie:


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

Dzienne powtarzania: typ NeverEnd

Typ zakończenia można ustawić za pomocą MapiCalendarRecurrenceEndType.NeverEnd. Okres lub INTERVAL można ustawić na wymaganą wartość, np. 1, w poniższym przykładzie.

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

Praca z tygodniowymi powtórzeniami

Aspose.Email oferuje bogate funkcje tworzenia tygodniowych powtórzeń przy użyciu MapiCalendarWeeklyRecurrencePattern. Można użyć trzech różnych typów zakończenia powtórzenia kalendarza Mapi, w tym EndAfterNOccurrences, EndAfterDate i NeverEnd. Ta sekcja demonstruje tworzenie różnych tygodniowych wzorców powtórzeń.

Tygodniowe powtarzania: typ EndAfterNOccurrences

W tym typie powtórzenia liczba powtórzeń powinna być ustawiona wraz z innymi informacjami, jak poniżej:

  1. Ustaw daty początkową, końcową i termin realizacji.
  2. Utwórz MapiTask.
  3. Ustaw stan zadania na NotAssigned.
  4. Utwórz obiekt tygodniowego powtórzenia, ustawiając właściwości takie jak PatternType, Period, WeekStartDay, EndType oraz OccurenceCount.
  5. Ustaw właściwość MapiTask.Recurrence na ten obiekt tygodniowego powtórzenia.
  6. Zapisz tę wiadomość na dysku.

Poniższy fragment kodu pokazuje, jak utworzyć zadanie z typem zakończenia powtórzenia 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);

Poniższa funkcja może być użyta do obliczenia liczby zdarzeń pomiędzy dwoma datami:

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

Wybieranie wielu dni w tygodniu

Poniższy fragment kodu pokazuje, jak wybrać wiele dni w tygodniu.

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

Wybieranie wielu dni w tygodniu i ustawianie interwałów

Poniższy fragment kodu pokazuje, jak wybrać wiele dni w tygodniu i ustawić interwały.

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

Tygodniowe powtarzania: typ EndAfterDate

Opcja "End By" w zadaniu Mapi jest realizowana poprzez ustawienie właściwości OccurrenceCount, obliczanej przez funkcję GetOccurrenceCount(). Funkcja ta przyjmuje datę początkową, datę końcową oraz ciąg RRULE.

Tygodniowe powtórzenia: Ustawianie wartości Każdy Dzień

Poniższy fragment kodu pokazuje, jak ustawić wartość period na 1 oraz wartość INTERVAL na 1 w ciągu 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"),
};

Wartość Every Day można ustawić na dowolną odpowiednią wartość, a wiele dni można wybrać, jak pokazano w poniższym przykładzie:

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"),
};

Tygodniowe powtarzania: typ NeverEnd

Typ zakończenia można ustawić za pomocą MapiCalendarRecurrenceEndType.NeverEnd. Okres lub INTERVAL można ustawić na wymaganą wartość, np. 1, w poniższym przykładzie.

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

Praca z miesięcznymi powtórzeniami

Aspose.Email obsługuje tworzenie miesięcznych powtórzeń przy użyciu MapiCalendarMonthlyRecurrencePattern. Można użyć trzech różnych typów zakończenia powtórzenia kalendarza Mapi, w tym EndAfterNOccurrences, EndAfterDate i NeverEnd. Ta sekcja demonstruje tworzenie różnych miesięcznych wzorców powtórzeń.

Miesięczne powtarzania: typ EndAfterNOccurrences

W tym typie powtórzenia liczba powtórzeń powinna być ustawiona wraz z innymi informacjami, jak poniżej:

  1. Ustaw daty początkową, końcową i termin realizacji.
  2. Utwórz MapiTask.
  3. Ustaw stan zadania na NotAssigned.
  4. Utwórz obiekt miesięcznego powtórzenia, ustawiając właściwości takie jak PatternType, Period, WeekStartDay, EndType oraz OccurenceCount.
  5. Ustaw właściwość MapiTask.Recurrence na ten obiekt miesięcznego powtórzenia.
  6. Zapisz tę wiadomość na dysku.

Poniższy fragment kodu pokazuje, jak utworzyć zadanie z typem zakończenia powtórzenia 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);

Poniższa funkcja może być użyta do obliczenia liczby zdarzeń pomiędzy dwoma datami:

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

Ustaw stałą liczbę wystąpień

Poniższy fragment kodu pokazuje, jak ustawić stałą liczbę wystąpień.

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

Miesięczne powtarzania: typ EndAfterDate

Opcja "End By" w zadaniu Mapi jest realizowana poprzez ustawienie właściwości OccurrenceCount, obliczanej przez funkcję GetOccurrenceCount(). Funkcja ta przyjmuje datę początkową, datę końcową oraz ciąg RRULE. Poniższy fragment kodu pokazuje, jak utworzyć powtórzenie 15-go dnia każdego miesiąca między datą początkową a końcową.

// 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);

Miesięczne powtarzania: typ NeverEnd

Poniższy fragment kodu pokazuje, jak ustawić typ zakończenia za pomocą MapiCalendarRecurrenceEndType.NeverEnd.

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

Praca z rocznymi powtórzeniami

Aspose.Email obsługuje tworzenie rocznych powtórzeń przy użyciu MapiCalendarMonthlyRecurrencePattern. Ustawiając właściwość period na 12, możemy uzyskać roczny wzorzec powtórzenia. Można użyć trzech różnych typów zakończenia powtórzenia kalendarza Mapi, w tym EndAfterNOccurrences, EndAfterDate i NeverEnd. Ta sekcja demonstruje tworzenie różnych rocznych wzorców powtórzeń.

Roczne powtarzania: typ EndAfterNOccurrences

W tym typie powtórzenia liczba powtórzeń powinna być ustawiona wraz z innymi informacjami, jak poniżej:

  1. Ustaw daty początkową, końcową i termin realizacji.
  2. Utwórz MapiTask.
  3. Ustaw stan zadania na NotAssigned.
  4. Utwórz obiekt miesięcznego powtórzenia, ustawiając właściwości takie jak PatternType, Period, WeekStartDay, EndType oraz OccurenceCount.
  5. Ustaw właściwość MapiTask.Recurrence na ten obiekt miesięcznego powtórzenia, aby uzyskać roczne powtórzenie.
  6. Zapisz tę wiadomość na dysku.

Poniższy fragment kodu pokazuje, jak utworzyć zadanie z typem zakończenia powtórzenia 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);

Roczne powtarzania: typ EndAfterDate

Opcja "End By" w zadaniu Mapi jest realizowana poprzez ustawienie właściwości OccurrenceCount, obliczanej przez funkcję GetOccurrenceCount(). Funkcja ta przyjmuje datę początkową, datę końcową oraz ciąg RRULE. Poniższy fragment kodu pokazuje, jak utworzyć powtórzenie 15-go dnia każdego 7-go miesiąca między datą początkową a końcową.

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

Roczne powtarzania: typ NeverEnd

Poniższy fragment kodu pokazuje, jak ustawić typ zakończenia za pomocą MapiCalendarRecurrenceEndType.NeverEnd.

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

Generowanie powtarzania z reguły powtarzania

API Aspose.Email zapewnia możliwość generowania wzorca powtórzenia z reguły powtórzenia (RRULE). Analizuje informacje z RRULE zgodnie ze specyfikacją iCal RFC 5545 i generuje wzorzec powtórzenia przy użyciu metody MapiCalendarRecurrencePatternFactory.FromString. Poniższy fragment kodu pokazuje, jak wygenerować wzorzec powtórzenia z reguły powtórzenia.

// 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);

Dodaj załącznik do powtarzających się wydarzeń kalendarza

API Aspose.Email zapewnia możliwość dodawania załączników do powtarzających się zdarzeń kalendarza.

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