Administrar elementos del calendario de Outlook
Este artículo cubre Outlook MapiCalendar elementos de calendario guardados como MSG. Para trabajar con citas iCalendar (ICS) basadas en estándares y solicitudes de reunión, vea Administrar citas; para almacenar y leer elementos del calendario dentro de un PST, vea Administrar elementos del calendario en archivos PST.
Aspose.Email MapiCalendar La clase proporciona métodos y atributos para establecer varias propiedades de un elemento de calendario. Esta sección ofrece ejemplos de código para:
- Crear y Guardar Elementos de Calendario
- Guardar Elementos de Calendario como Archivos MSG
- Guardar IDs de Producto para Elementos de Calendario MAPI a ICS
- Obtener el número total de eventos
- Agregar Recordatorios Visuales
- Agregar Recordatorios de Audio
- Agregar/recuperar adjuntos de archivos de calendario
- Verificar el Estado de los Destinatarios en Solicitudes de Reunión
- Crear zona horaria de calendario MAPI a partir de la zona horaria estándar
- Establecer Recordatorios para Citas
- Convertir cita EML a MSG con cuerpo HTML
- Establecer el Estado de los Elementos de Calendario MAPI Manualmente
Crear y guardar elementos del calendario
El siguiente fragmento de código muestra cómo crear y guardar un elemento de calendario en 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);
Guardar Elementos de Calendario como Archivos MSG
El siguiente fragmento de código muestra cómo guardar el elemento del calendario como MSG.
calendar.Save(dataDir + "CalendarItemAsMSG_out.Msg", AppointmentSaveFormat.Msg);
Guardar IDs de Producto para Elementos de Calendario MAPI a ICS
El ProductIdentifier propiedad del MapiCalendarIcsSaveOptions La clase se usa para guardar un elemento de calendario MAPI en un archivo iCalendar (ICS) preservando la información original de fecha y hora, así como un identificador de producto personalizado. La propiedad especifica el identificador del producto que creó el objeto iCalendar.
El siguiente ejemplo de código muestra cómo trabajar con datos iCalendar (ICS) dentro de un objeto de calendario MAPI:
var icsSaveOptions = new MapiCalendarIcsSaveOptions
{
KeepOriginalDateTimeStamp = true,
ProductIdentifier = "Foo Ltd"
};
mapiCalendar.Save("my.ics", icsSaveOptions);
Obtener Número Total de Eventos
El CalendarReader clase permite manejar eventos de calendario sin esfuerzo. Las siguientes propiedades y un método le permiten trabajar con múltiples eventos:
- CalendarReader.Count - La propiedad Count de la clase CalendarReader le permite obtener el número de componentes Vevent (eventos) presentes en el calendario, facilitando el seguimiento del número total de eventos.
- CalendarReader.IsMultiEvents - Esta propiedad determina si el calendario contiene varios eventos. Proporciona un valor booleano que indica si el calendario contiene más de un evento, ayudando a identificar calendarios con uno o varios eventos.
- CalendarReader.Method - La propiedad Method obtiene el tipo de método iCalendar asociado al objeto calendario. Devuelve el tipo de método, como “REQUEST”, “PUBLISH” o “CANCEL”, proporcionando información valiosa sobre el propósito del calendario.
- CalendarReader.Version - Obtiene la versión de iCalendar.
- CalendarReader.LoadAsMultiple() Este método permite cargar una lista de eventos de un calendario que contiene múltiples eventos. Devuelve una lista de objetos Appointment, facilitando el acceso y procesamiento individual de cada evento.
El siguiente ejemplo de código demuestra cómo puede implementar estas capacidades en su proyecto:
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();
Agregar Recordatorios Visuales
El siguiente fragmento de código muestra cómo agregar un recordatorio visual a un calendario.
// 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);
Agregar Recordatorios de Audio
El siguiente fragmento de código muestra cómo añadir un recordatorio de audio a un calendario.
// 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);
Agregar/recuperar adjuntos de archivos de calendario
El siguiente fragmento de código muestra cómo agregar/recuperar adjuntos de archivos de calendario.
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 el Estado de los Destinatarios en Solicitudes de Reunión
El siguiente fragmento de código muestra cómo mostrar el estado de los destinatarios de una solicitud de reunión.
MapiMessage message = MapiMessage.FromFile(fileName);
foreach (MapiRecipient recipient in message.Recipients)
{
Console.WriteLine(recipient.RecipientTrackStatus);
}
Crear zona horaria de calendario MAPI a partir de zona horaria estándar
El siguiente fragmento de código muestra cómo crear MapiCalendarTimeZone a partir de la zona horaria estándar.
MapiCalendarTimeZone timeZone = new MapiCalendarTimeZone(TimeZoneInfo.Local);
Establecer Recordatorios para Citas
Se puede añadir un recordatorio cuando se crea una cita. Estas alarmas pueden activarse según diferentes criterios, como n minutos antes de que comience el programa, repetir n veces a intervalos de n. Se pueden usar distintas etiquetas para crear estos disparadores en el script encerrado entre BEGIN:VALARM y END:VALARM dentro de una cita. Existe una serie de variantes en las que el recordatorio puede configurarse en una cita.
Agregar Etiquetas para Configurar Recordatorios
El siguiente fragmento de código muestra cómo establecer un recordatorio añadiendo etiquetas.
// 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");
Convertir cita EML a MSG con cuerpo HTML
Desde la versión 19.3, Aspose.Email ofrece la capacidad de convertir citas EML a MSG manteniendo el cuerpo HTML de la cita. Aspose.Email proporciona un MapiConversionOptions.ForcedRtfBodyForAppointment propiedad que tiene un valor predeterminado de true. Cuando el valor de MapiConversionOptions.ForcedRtfBodyForAppointment está configurado a true, el cuerpo de la cita se convierte a formato RTF. Para mantener el formato del cuerpo de la cita en HTML, establezca el valor de MapiConversionOptions.ForcedRtfBodyForAppointment a false.
El siguiente ejemplo demuestra el uso de MapiConversionOptions.ForcedRtfBodyForAppointment propiedad para mantener el formato del cuerpo de la cita en 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");
Establecer el Estado de los Elementos de Calendario MAPI Manualmente
Establezca explícitamente el estado de un objeto de Calendario MAPI, anulando el comportamiento predeterminado. Esto permite un mejor control sobre los estados de los eventos del calendario, particularmente al manejar solicitudes de reunión recibidas. Por defecto, cuando se crea una reunión, su estado es MapiCalendarState.Meeting. Cuando se recibe en la bandeja de entrada del destinatario, cambia automáticamente a MapiCalendarState.Received, y su clase de mensaje se actualiza a “IPM.Schedule.Meeting.Request”. Usando SetStateForced permite establecer manualmente el estado a Received, lo que puede ser útil para conservar la información del organizador al guardar el calendario como un archivo MSG. Sin embargo, esto puede impedir el reenvío o reenvío adecuado de la reunión.
El ejemplo de código a continuación demuestra cómo crear un MapiCalendar objeto, asignar un organizador y establecer explícitamente su estado a ambos Meeting y Received usando SetStateForced. Luego guarda el elemento del calendario como un archivo .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);
Ver también
- Administrar citas — trabajar con citas iCalendar (ICS) y solicitudes de reunión.
- Administrar elementos del calendario en archivos PST — almacenar y leer elementos del calendario dentro de un PST.