Работа с элементами календаря в PST-файле

Добавление MapiCalendar в PST

Создание нового PST-файла и добавление подпапок показало, как создать PST-файл и добавить к нему подпапку. С помощью Aspose.Email вы можете добавить MapiCalendar в подпапку Календаря PST-файла, который вы создали или загрузили. Ниже приведены шаги для добавления MapiCalendar в PST:

  1. Создайте объект MapiCalendar.
  2. Установите свойства MapiCalendar с помощью конструктора и методов.
  3. Создайте PST с помощью метода PersonalStorage.Create().
  4. Создайте предопределенную папку (Календарь) в корне PST-файла, обратившись к корневой папке и затем вызвав метод AddMapiMessageItem().

Следующий фрагмент кода показывает, как создать MapiCalendar и затем добавить его в папку календаря только что созданного PST-файла.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
string dataDir = RunExamples.GetDataDir_Outlook();
// Create the appointment
MapiCalendar appointment = new MapiCalendar(
"LAKE ARGYLE WA 6743",
"Appointment",
"This is a very important meeting :)",
new DateTime(2012, 10, 2, 13, 0, 0),
new DateTime(2012, 10, 2, 14, 0, 0));
// Create the meeting
MapiRecipientCollection attendees = new MapiRecipientCollection();
attendees.Add("ReneeAJones@armyspy.com", "Renee A. Jones", MapiRecipientType.MAPI_TO);
attendees.Add("SzllsyLiza@dayrep.com", "Szollosy Liza", MapiRecipientType.MAPI_TO);
MapiCalendar meeting = new MapiCalendar(
"Meeting Room 3 at Office Headquarters",
"Meeting",
"Please confirm your availability.",
new DateTime(2012, 10, 2, 13, 0, 0),
new DateTime(2012, 10, 2, 14, 0, 0),
"CharlieKhan@dayrep.com",
attendees
);
string path = dataDir + "AddMapiCalendarToPST_out.pst";
if (File.Exists(path))
{
File.Delete(path);
}
using (PersonalStorage pst = PersonalStorage.Create(dataDir + "AddMapiCalendarToPST_out.pst", FileFormatVersion.Unicode))
{
FolderInfo calendarFolder = pst.CreatePredefinedFolder("Calendar", StandardIpmFolder.Appointments);
calendarFolder.AddMapiMessageItem(appointment);
calendarFolder.AddMapiMessageItem(meeting);
}

Сохранение элементов календаря из PST на диск в формате ICS

Эта статья показывает, как получить элементы календаря из файла Outlook PST и сохранить календарь на диск в формате ICS. Используйте классы PersonalStorage и MapiCalendar для получения информации о календаре. Ниже приведены шаги для сохранения элементов календаря:

  1. Загрузите PST-файл в класс PersonalStorage.
  2. Просмотрите папку Календарь.
  3. Получите содержимое папки Календарь, чтобы получить коллекцию сообщений.
  4. Переберите коллекцию сообщений.
  5. Вызовите метод PersonalStorage.ExtractMessage(), чтобы получить информацию о контакте в классе MapiCalendar.
  6. Вызовите метод MapiCalendar.Save(), чтобы сохранить элемент календаря на диск в формате ICS.

Программа ниже загружает PST-файл с диска и сохраняет все элементы календаря в формате ICS. Файлы ICS затем можно использовать в любой другой программе, которая может загрузить стандартный файл календаря ICS. Открытый в Microsoft Outlook, файл ICS выглядит как на приведенном ниже скриншоте.

todo:image_alt_text
Следующий фрагмент кода показывает, как экспортировать элементы календаря из Outlook PST в формат ICS.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
// The path to the documents directory.
string dataDir = RunExamples.GetDataDir_Outlook();
// Load the Outlook PST file
PersonalStorage pst = PersonalStorage.FromFile(dataDir + "Sub.pst");
// Get the Calendar folder
FolderInfo folderInfo = pst.RootFolder.GetSubFolder("Inbox");
// Loop through all the calendar items in this folder
MessageInfoCollection messageInfoCollection = folderInfo.GetContents();
foreach (MessageInfo messageInfo in messageInfoCollection)
{
// Get the calendar information
MapiMessage calendar = (MapiMessage)pst.ExtractMessage(messageInfo).ToMapiMessageItem();
// Display some contents on screen
Console.WriteLine("Name: " + calendar.Subject);
// Save to disk in ICS format
calendar.Save(dataDir + @"\Calendar\" + calendar.Subject + "_out.ics");
}

Сохранение как ICS с оригинальной меткой времени

Следующие функции доступны для сохранения элементов календаря в формате ICS с сохранением их оригинальной информации о дате и времени:

Используйте приведенный ниже образец кода, чтобы реализовать функции в своем проекте:

var cal = pst.ExtractMessage(msgInfo).ToMapiMessageItem() as MapiCalendar;

if (cal != null)
{
  cal.Save("cal.ics", new MapiCalendarIcsSaveOptions() { KeepOriginalDateTimeStamp = true});
}

Изменение/удаление событий из повторений

Исключения могут быть добавлены к существующим повторениям с использованием API Aspose.Email для .NET. Следующий образец кода иллюстрирует использование этой функции.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
DateTime startDate = DateTime.Now.Date.AddHours(12);
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(1);
// adding one exception
pattern.Exceptions.Add(new MapiCalendarExceptionInfo
{
Location = "London",
Subject = "Subj",
OriginalStartDate = exceptionDate,
StartDateTime = exceptionDate,
EndDateTime = exceptionDate.AddHours(5)
});
pattern.ModifiedInstanceDates.Add(exceptionDate);
// every modified instance also has to have an entry in the DeletedInstanceDates field with the original instance date.
pattern.DeletedInstanceDates.Add(exceptionDate);
// adding one deleted instance
pattern.DeletedInstanceDates.Add(exceptionDate.AddDays(2));
MapiRecipientCollection recColl = new MapiRecipientCollection();
recColl.Add("receiver@domain.com", "receiver", MapiRecipientType.MAPI_TO);
MapiCalendar newCal = new MapiCalendar(
"This is Location",
"This is Summary",
"This is recurrence test",
startDate,
startDate.AddHours(3),
"organizer@domain.com",
recColl);
newCal.Recurrence = recurrence;
using (MemoryStream memory = new MemoryStream())
{
PersonalStorage pst = PersonalStorage.Create(memory, FileFormatVersion.Unicode);
FolderInfo calendarFolder = pst.CreatePredefinedFolder("Calendar", StandardIpmFolder.Appointments);
calendarFolder.AddMapiMessageItem(newCal);
}