Gerenciando itens de calendário do Outlook
Este artigo cobre Outlook MapiCalendar itens de calendário salvos como MSG. Para trabalhar com compromissos iCalendar (ICS) baseados em padrões e solicitações de reunião, veja Gerenciar Compromissos; para armazenar e ler itens de calendário dentro de um PST, veja Gerenciando Itens de Calendário em Arquivos PST.
Aspose.Email MapiCalendar A classe fornece métodos e atributos para definir várias propriedades de um item de calendário. Esta seção oferece exemplos de código para:
- Criar e Salvar Itens de Calendário
- Salvar Itens de Calendário como Arquivos MSG
- Salvar IDs de Produto para Itens de Calendário MAPI em ICS
- Obter Número Total de Eventos
- Adicionar Lembretes de Exibição
- Adicionar Lembretes de Áudio
- Adicionar/Recuperar Anexos de Arquivos de Calendário
- Verificar o Status dos Destinatários em Convites de Reunião
- Criar Fuso Horário de Calendário MAPI a partir de Fuso Horário Padrão
- Definir Lembretes para Compromissos
- Converter Appointment EML para MSG com Corpo HTML
- Definir o Estado dos Itens de Calendário MAPI Manualmente
Criar e salvar itens de calendário
O trecho de código a seguir mostra como criar e salvar um item de calendário no formato 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);
Salvar Itens de Calendário como Arquivos MSG
O trecho de código a seguir mostra como salvar o item de calendário como MSG.
calendar.Save(dataDir + "CalendarItemAsMSG_out.Msg", AppointmentSaveFormat.Msg);
Salvar IDs de Produto para Itens de Calendário MAPI em ICS
O ProductIdentifier propriedade do MapiCalendarIcsSaveOptions classe é usada para salvar um item de calendário MAPI em um arquivo iCalendar (ICS) preservando as informações originais de data e hora, bem como um identificador de produto personalizado. A propriedade especifica o identificador do produto que criou o objeto iCalendar.
O exemplo de código a seguir mostra como trabalhar com dados iCalendar (ICS) dentro de um objeto de calendário MAPI:
var icsSaveOptions = new MapiCalendarIcsSaveOptions
{
KeepOriginalDateTimeStamp = true,
ProductIdentifier = "Foo Ltd"
};
mapiCalendar.Save("my.ics", icsSaveOptions);
Obter Número Total de Eventos
O CalendarReader classe permite manipular eventos de calendário sem esforço. As propriedades a seguir e um método permitem que você trabalhe com múltiplos eventos:
- CalendarReader.Count - A propriedade Count da classe CalendarReader permite recuperar o número de componentes Vevent (eventos) presentes no calendário, facilitando o acompanhamento do número total de eventos.
- CalendarReader.IsMultiEvents - Esta propriedade determina se o calendário contém múltiplos eventos. Ela fornece um valor booleano indicando se o calendário contém mais de um evento, auxiliando na identificação de calendários com um único ou múltiplos eventos.
- CalendarReader.Method - A propriedade Method obtém o tipo de método iCalendar associado ao objeto de calendário. Ela retorna o tipo de método, como “REQUEST”, “PUBLISH” ou “CANCEL”, fornecendo informações valiosas sobre o propósito do calendário.
- CalendarReader.Version - Obtém a Versão do iCalendar.
- CalendarReader.LoadAsMultiple() Este método permite o carregamento de uma lista de eventos de um calendário que contém múltiplos eventos. Ele retorna uma lista de objetos Appointment, possibilitando acesso fácil e processamento individual de cada evento.
O exemplo de código a seguir demonstra como você pode implementar esses recursos em seu projeto:
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();
Adicionar Lembretes de Exibição
O trecho de código a seguir mostra como adicionar um lembrete de exibição a um calendário.
// 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);
Adicionar Lembretes de Áudio
O trecho de código a seguir mostra como adicionar um lembrete de áudio a um calendário.
// 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);
Adicionar/Recuperar Anexos de Arquivos de Calendário
O trecho de código a seguir mostra como adicionar/recuperar anexos de arquivos de calendário.
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);
Verificar Status dos Destinatários em Convites de Reunião
O trecho de código a seguir mostra como exibir o status dos destinatários de um convite de reunião.
MapiMessage message = MapiMessage.FromFile(fileName);
foreach (MapiRecipient recipient in message.Recipients)
{
Console.WriteLine(recipient.RecipientTrackStatus);
}
Criar Fuso Horário de Calendário MAPI a partir de Fuso Horário Padrão
O trecho de código a seguir mostra como criar MapiCalendarTimeZone a partir de fuso horário padrão.
MapiCalendarTimeZone timeZone = new MapiCalendarTimeZone(TimeZoneInfo.Local);
Definir Lembretes para Compromissos
Um lembrete pode ser adicionado quando um compromisso é criado. Esses alarmes podem ser acionados com base em diferentes critérios, como n minutos antes do início da programação, repetir n vezes em intervalos de n. Tags diferentes podem ser usadas para criar esses gatilhos no script encerrado por BEGIN:VALARM e END:VALARM dentro de um compromisso. Existem várias variantes em que o lembrete pode ser configurado em um compromisso.
Adicionar Etiquetas para Definir Lembretes
O trecho de código a seguir mostra como definir um lembrete adicionando tags.
// 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");
Converter Appointment EML para MSG com corpo HTML
Desde a versão 19.3, Aspose.Email oferece a capacidade de converter Appointment EML para MSG mantendo o corpo HTML do compromisso. Aspose.Email fornece um MapiConversionOptions.ForcedRtfBodyForAppointment propriedade que tem um valor padrão de true. Quando o valor de MapiConversionOptions.ForcedRtfBodyForAppointment é definido como true, o corpo do compromisso é convertido para o formato RTF. Para manter o formato do corpo do compromisso em HTML, defina o valor de MapiConversionOptions.ForcedRtfBodyForAppointment para false.
O exemplo a seguir demonstra o uso de MapiConversionOptions.ForcedRtfBodyForAppointment propriedade para manter o formato do corpo do compromisso em 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");
Definir o Estado de Itens de Calendário MAPI Manualmente
Defina explicitamente o estado de um objeto MAPI Calendar, sobrescrevendo o comportamento padrão. Isso permite melhor controle sobre os estados de eventos de calendário, particularmente ao lidar com solicitações de reunião recebidas. Por padrão, quando uma reunião é criada, seu estado é MapiCalendarState.Meeting. Quando recebido na caixa de entrada do destinatário, ele muda automaticamente para MapiCalendarState.Received, e sua classe de mensagem é atualizada para “IPM.Schedule.Meeting.Request”. Usando SetStateForced permite definir manualmente o estado como Received, o que pode ser útil para preservar informações do organizador ao salvar o calendário como um arquivo MSG. No entanto, isso pode impedir o encaminhamento ou reenvio adequado da reunião.
O exemplo de código abaixo demonstra como criar um MapiCalendar objeto, atribua um organizador e defina explicitamente seu estado como ambos Meeting e Received usando SetStateForced. Em seguida, salva o item de calendário como um arquivo .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);
Veja Também
- Gerenciar Compromissos — trabalhar com compromissos iCalendar (ICS) e solicitações de reunião.
- Gerenciando Itens de Calendário em Arquivos PST — armazenar e ler itens de calendário dentro de um PST.