Управление элементами календаря Outlook

Эта статья рассматривает Outlook MapiCalendar элементы календаря, сохранённые как MSG. Чтобы работать со стандартными iCalendar (ICS) встречами и запросами на собрания, см. Управление встречами; чтобы хранить и считывать элементы календаря внутри PST, см. Управление элементами календаря в файлах PST.

Aspose.Email MapiCalendar Класс предоставляет методы и атрибуты для установки различных свойств элемента календаря. В этом разделе представлены примеры кода для:

Создать и сохранить элементы календаря

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

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

// Create the appointment
MapiCalendar calendar = 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));

calendar.Save(dataDir + "CalendarItem_out.ics", AppointmentSaveFormat.Ics);

Сохранить элементы календаря как файлы MSG

Следующий фрагмент кода показывает, как сохранить элемент календаря в формате MSG.

calendar.Save(dataDir + "CalendarItemAsMSG_out.Msg", AppointmentSaveFormat.Msg);

Сохранить идентификаторы продуктов для элементов календаря MAPI в формат ICS

Этот ProductIdentifier свойство MapiCalendarIcsSaveOptions класс используется для сохранения элемента календаря MAPI в файл iCalendar (ICS), сохраняя исходные дату и время, а также пользовательский идентификатор продукта. Свойство задаёт идентификатор продукта, создавшего объект iCalendar.

Следующий пример кода показывает, как работать с данными iCalendar (ICS) внутри объекта MAPI календаря:

var icsSaveOptions = new MapiCalendarIcsSaveOptions
{
    KeepOriginalDateTimeStamp = true,
    ProductIdentifier = "Foo Ltd"
};

mapiCalendar.Save("my.ics", icsSaveOptions);

Получить общее количество событий

Этот CalendarReader класс упрощает работу с событиями календаря. Следующие свойства и метод позволяют работать с несколькими событиями:

  • CalendarReader.Count — свойство Count класса CalendarReader позволяет получить количество компонентов Vevent (событий), присутствующих в календаре, упрощая подсчёт общего количества событий.
  • CalendarReader.IsMultiEvents — это свойство определяет, содержит ли календарь несколько событий. Оно возвращает логическое значение, указывающее, есть ли в календаре более одного события, помогая отличать календари с одним или несколькими событиями.
  • CalendarReader.Method — свойство Method получает тип метода iCalendar, связанный с объектом календаря. Оно возвращает тип метода, например “REQUEST”, “PUBLISH” или “CANCEL”, предоставляя ценную информацию о назначении календаря.
  • CalendarReader.Version — получает версию iCalendar.
  • CalendarReader.LoadAsMultiple() Этот метод позволяет загрузить список событий из календаря, содержащего несколько событий. Он возвращает список объектов Appointment, обеспечивая простой доступ и обработку каждого события отдельно.

Следующий пример кода демонстрирует, как можно реализовать эти возможности в вашем проекте:

var reader = new CalendarReader(fileName);
Console.WriteLine("Calendar contains " + reader.Count + " events");
Console.WriteLine("The Version of the calendar is " + reader.Version);
Console.WriteLine("The Method of the calendar is " + reader.Method);
Console.WriteLine("Does the calendar contain multiple events? - " + reader.IsMultiEvents);
List<Appointment> appointments = reader.LoadAsMultiple();

Добавить визуальные напоминания

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

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

// Create Appointment 
Appointment app = new Appointment("Home", DateTime.Now.AddHours(1), DateTime.Now.AddHours(1), "organizer@domain.com", "attendee@gmail.com");
MailMessage msg = new MailMessage();
msg.AddAlternateView(app.RequestApointment());
MapiMessage mapi = MapiMessage.FromMailMessage(msg);
MapiCalendar calendar = (MapiCalendar)mapi.ToMapiMessageItem();

// Set calendar Properties 
calendar.ReminderSet= true;
calendar.ReminderDelta = 45;//45 min before start of event

string savedFile = (dataDir + "calendarWithDisplayReminder.ics");
calendar.Save(savedFile, AppointmentSaveFormat.Ics);

Добавить звуковые напоминания

Следующий фрагмент кода показывает, как добавить аудио‑напоминание в календарь.

// The path to the File directory.
string dataDir = RunExamples.GetDataDir_Outlook();
Appointment app = new Appointment("Home", DateTime.Now.AddHours(1), DateTime.Now.AddHours(1), "organizer@domain.com", "attendee@gmail.com");

MailMessage msg = new MailMessage();
msg.AddAlternateView(app.RequestApointment());
MapiMessage mapi = MapiMessage.FromMailMessage(msg);
MapiCalendar calendar = (MapiCalendar)mapi.ToMapiMessageItem();

// Set calendar properties
calendar.ReminderSet = true;
calendar.ReminderDelta = 58;//58 min before start of event
calendar.ReminderFileParameter = dataDir + "Alarm01.wav";
string savedFile = (dataDir + "calendarWithAudioReminder_out.ics");
calendar.Save(savedFile, AppointmentSaveFormat.Ics);

Добавить/получить вложения из файлов календаря

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

string[] files = new string[3];
files[0] = dataDir + "attachment_1.doc";
files[1] = dataDir + "download.png";
files[2] = dataDir + "Desert.jpg";

Appointment app1 = new Appointment("Home", DateTime.Now.AddHours(1), DateTime.Now.AddHours(1), "organizer@domain.com", "attendee@gmail.com");
foreach (string file in files)
{
    using (MemoryStream ms = new MemoryStream(File.ReadAllBytes(file)))
    {
        app1.Attachments.Add(new Attachment(ms, Path.GetFileName(file)));
    }
}

app1.Save(dataDir + "appWithAttachments_out.ics", AppointmentSaveFormat.Ics);

Appointment app2 = Appointment.Load(dataDir + "appWithAttachments_out.ics");
Console.WriteLine(app2.Attachments.Count);
foreach (Attachment att in app2.Attachments)
    Console.WriteLine(att.Name);

Проверить статус получателей в запросах на собрание

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

MapiMessage message = MapiMessage.FromFile(fileName);
foreach (MapiRecipient recipient in message.Recipients)
{
    Console.WriteLine(recipient.RecipientTrackStatus);
}

Создать часовой пояс календаря MAPI из стандартного часового пояса

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

MapiCalendarTimeZone timeZone = new MapiCalendarTimeZone(TimeZoneInfo.Local);

Установить напоминания для встреч

Напоминание можно добавить при создании встречи. Эти сигналы могут срабатывать по разным критериям, например за n минут до начала расписания, повторяться n раз с интервалом n. Для создания этих триггеров в скрипте, заключённом между BEGIN:VALARM и END:VALARM внутри встречи, можно использовать различные теги. Существует несколько вариантов настройки напоминания для встречи.

Добавить метки для установки напоминаний

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

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

string location = "Meeting Location: Room 5";
DateTime startDate = new DateTime(1997, 3, 18, 18, 30, 00),
endDate = new DateTime(1997, 3, 18, 19, 30, 00);
MailAddress organizer = new MailAddress("aaa@amail.com", "Organizer");
MailAddressCollection attendees = new MailAddressCollection();
attendees.Add(new MailAddress("bbb@bmail.com", "First attendee"));

Appointment target = new Appointment(location, startDate, endDate, organizer, attendees);

// Audio alarm that will sound at a precise time and
// Repeat 4 more times at 15 minute intervals:
AppointmentReminder audioReminder = new AppointmentReminder();
audioReminder.Trigger = new ReminderTrigger(new DateTime(1997, 3, 17, 13, 30, 0, DateTimeKind.Utc));
audioReminder.Repeat = 4;
audioReminder.Duration = new ReminderDuration(new TimeSpan(0, 15, 0));
audioReminder.Action = ReminderAction.Audio;
ReminderAttachment attach = new ReminderAttachment(new Uri("ftp://Host.com/pub/sounds/bell-01.aud"));
audioReminder.Attachments.Add(attach);
target.Reminders.Add(audioReminder);


// Display alarm that will trigger 30 minutes before the
// Scheduled start of the event it is
// Associated with and will repeat 2 more times at 15 minute intervals:
AppointmentReminder displayReminder = new AppointmentReminder();
ReminderDuration dur = new ReminderDuration(new TimeSpan(0, -30, 0));
displayReminder.Trigger = new ReminderTrigger(dur, ReminderRelated.Start);
displayReminder.Repeat = 2;
displayReminder.Duration = new ReminderDuration(new TimeSpan(0, 15, 0));
displayReminder.Action = ReminderAction.Display;
displayReminder.Description = "Breakfast meeting with executive team at 8:30 AM EST";
target.Reminders.Add(displayReminder);

// Email alarm that will trigger 2 days before the
// Scheduled due date/time. It does not
// Repeat. The email has a subject, body and attachment link.
AppointmentReminder emailReminder = new AppointmentReminder();
ReminderDuration dur1 = new ReminderDuration(new TimeSpan(-2, 0, 0, 0));
emailReminder.Trigger = new ReminderTrigger(dur1, ReminderRelated.Start);
ReminderAttendee attendee = new ReminderAttendee("john_doe@host.com");
emailReminder.Attendees.Add(attendee);
emailReminder.Action = ReminderAction.Email;
emailReminder.Summary = "REMINDER: SEND AGENDA FOR WEEKLY STAFF MEETING";
emailReminder.Description = @"A draft agenda needs to be sent out to the attendees to the weekly managers meeting (MGR-LIST). Attached is a pointer the document template for the agenda file.";
ReminderAttachment attach1 = new ReminderAttachment(new Uri("http://Host.com/templates/agenda.doc"));
emailReminder.Attachments.Add(attach1);
target.Reminders.Add(emailReminder);

// Procedural alarm that will trigger at a precise date/time
// And will repeat 23 more times at one hour intervals. The alarm will
// Invoke a procedure file.
AppointmentReminder procReminder = new AppointmentReminder();
procReminder.Trigger = new ReminderTrigger(new DateTime(1998, 1, 1, 5, 0, 0, DateTimeKind.Utc));
procReminder.Repeat = 23;
procReminder.Duration = new ReminderDuration(new TimeSpan(1, 0, 0));
procReminder.Action = ReminderAction.Procedure;
ReminderAttachment attach2 = new ReminderAttachment(new Uri("ftp://Host.com/novo-procs/felizano.exe"));
procReminder.Attachments.Add(attach2);
target.Reminders.Add(procReminder);
target.Save(dataDir + "savedFile_out.ics");

Конвертировать Appointment EML в MSG с HTML‑телом

Начиная с версии 19.3, Aspose.Email предоставляет возможность конвертировать Appointment EML в MSG, сохраняя HTML‑тело встречи. Aspose.Email предоставляет MapiConversionOptions.ForcedRtfBodyForAppointment свойство, которое имеет значение по умолчанию true. Когда значение MapiConversionOptions.ForcedRtfBodyForAppointment установлено в true, тело встречи конвертируется в формат RTF. Чтобы сохранить формат тела встречи в HTML, задайте значение MapiConversionOptions.ForcedRtfBodyForAppointment на false.

Следующий пример демонстрирует использование MapiConversionOptions.ForcedRtfBodyForAppointment свойство для сохранения формата тела встречи в формате HTML.

// Outlook directory
string dataDir = RunExamples.GetDataDir_Outlook();

MailMessage mailMessage = MailMessage.Load(dataDir + "TestAppointment.eml");

MapiConversionOptions conversionOptions = new MapiConversionOptions();
conversionOptions.Format = OutlookMessageFormat.Unicode;

// default value for ForcedRtfBodyForAppointment is true
conversionOptions.ForcedRtfBodyForAppointment = false;

MapiMessage mapiMessage = MapiMessage.FromMailMessage(mailMessage, conversionOptions);

Console.WriteLine("Body Type: " + mapiMessage.BodyType);

mapiMessage.Save(dataDir + "TestAppointment_out.msg");

Установить состояние элементов MAPI Calendar вручную

Явно установить состояние объекта MAPI Calendar, переопределяя поведение по умолчанию. Это обеспечивает лучший контроль над состояниями событий календаря, особенно при обработке полученных запросов на встречи. По умолчанию, когда встреча создаётся, её состояние — MapiCalendarState.Meeting. При получении во входящие получателя он автоматически меняется на MapiCalendarState.Received, и класс сообщения обновляется до "IPM.Schedule.Meeting.Request". Используя SetStateForced позволяет вручную установить состояние в Received, что может быть полезно для сохранения информации об организаторе при сохранении календаря в файл MSG. Однако это может помешать корректной пересылке или повторной отправке встречи.

Пример кода ниже демонстрирует, как создать MapiCalendar объект, назначить организатора и явно установить его состояние в оба Meeting и Received используя SetStateForced. Затем он сохраняет элемент календаря как файл .msg.

MapiCalendar appointment = new MapiCalendar(
    "LAKE ARGYLE WA 6743",
    "Appointment",
    "This is a very important meeting :)",
    new DateTime(2024, 5, 10, 12, 30, 0, DateTimeKind.Utc),
    new DateTime(2024, 5, 10, 13, 30, 0, DateTimeKind.Utc));

appointment.Organizer = new MapiElectronicAddress
{
    EmailAddress = "test@aaa.com",
    DisplayName = "test display Name"
};

appointment.SetStateForced(MapiCalendarState.Meeting | MapiCalendarState.Received);

appointment.Save("appointment.msg", AppointmentSaveFormat.Msg);

См. также