Gestione degli elementi del calendario di Outlook

Questo articolo tratta Outlook MapiCalendar elementi del calendario salvati come MSG. Per lavorare con appuntamenti iCalendar (ICS) basati su standard e richieste di riunione, vedere Gestire gli appuntamenti; per archiviare e leggere gli elementi del calendario all’interno di un PST, vedere Gestione degli elementi di calendario nei file PST.

Aspose.Email MapiCalendar La classe fornisce metodi e attributi per impostare varie proprietà di un elemento di calendario. Questa sezione fornisce esempi di codice per:

Crea e salva elementi del calendario

Il seguente frammento di codice mostra come creare e salvare un elemento del calendario in 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);

Salva elementi del calendario come file MSG

Il seguente frammento di codice mostra come salvare l’elemento del calendario come MSG.

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

Salva gli ID prodotto per gli elementi MAPI Calendar in formato ICS

Il ProductIdentifier proprietà del MapiCalendarIcsSaveOptions la classe è usata per salvare un elemento calendario MAPI in un file iCalendar (ICS) preservando le informazioni originali di data e ora così come un identificatore di prodotto personalizzato. La proprietà specifica l’identificatore del prodotto che ha creato l’oggetto iCalendar.

Il seguente esempio di codice mostra come lavorare con i dati iCalendar (ICS) all’interno di un oggetto calendario MAPI:

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

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

Ottieni il numero totale di eventi

Il CalendarReader classe consente di gestire eventi di calendario senza sforzo. Le seguenti proprietà e un metodo permettono di lavorare con più eventi:

  • CalendarReader.Count - La proprietà Count della classe CalendarReader consente di recuperare il numero di componenti Vevent (eventi) presenti nel calendario, facilitando il conteggio totale degli eventi.
  • CalendarReader.IsMultiEvents - Questa proprietà determina se il calendario contiene più eventi. Fornisce un valore booleano che indica se il calendario contiene più di un evento, aiutando a identificare calendari con singoli o più eventi.
  • CalendarReader.Method - La proprietà Method ottiene il tipo di metodo iCalendar associato all’oggetto calendario. Restituisce il tipo di metodo, ad esempio “REQUEST”, “PUBLISH” o “CANCEL”, fornendo preziose informazioni sullo scopo del calendario.
  • CalendarReader.Version - Ottiene la versione di iCalendar.
  • CalendarReader.LoadAsMultiple() Questo metodo consente il caricamento di un elenco di eventi da un calendario contenente più eventi. Restituisce un elenco di oggetti Appointment, permettendo un facile accesso e la lavorazione di ciascun evento singolarmente.

Il seguente esempio di codice dimostra come è possibile implementare queste funzionalità nel tuo progetto:

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

Aggiungi promemoria visuali

Il seguente frammento di codice mostra come aggiungere un promemoria visuale 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);

Aggiungi promemoria audio

Il seguente frammento di codice mostra come aggiungere un promemoria 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);

Aggiungere/Recuperare allegati da file di calendario

Il seguente frammento di codice mostra come aggiungere/recuperare allegati da file di 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);

Verifica lo stato dei destinatari nelle richieste di riunione

Il seguente frammento di codice mostra come visualizzare lo stato dei destinatari da una richiesta di riunione.

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

Crea fuso orario MAPI Calendar da fuso orario standard

Il seguente frammento di codice mostra come creare MapiCalendarTimeZone da un fuso orario standard.

MapiCalendarTimeZone timeZone = new MapiCalendarTimeZone(TimeZoneInfo.Local);

Imposta promemoria per gli appuntamenti

È possibile aggiungere un promemoria quando viene creato un appuntamento. Questi avvisi possono attivarsi in base a criteri diversi, ad esempio n minuti prima dell’inizio della pianificazione, ripetere n volte a intervalli n. Tag diversi possono essere utilizzati per creare questi trigger nello script racchiuso da BEGIN:VALARM e END:VALARM all’interno di un appuntamento. Esistono numerose varianti per impostare il promemoria su un appuntamento.

Aggiungi tag per impostare promemoria

Il seguente frammento di codice mostra come impostare un promemoria aggiungendo tag.

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

Converti appuntamento EML in MSG con corpo HTML

Dalla versione 19.3, Aspose.Email offre la possibilità di convertire gli appuntamenti EML in MSG mantenendo il corpo HTML dell’appuntamento. Aspose.Email fornisce un MapiConversionOptions.ForcedRtfBodyForAppointment proprietà che ha un valore predefinito di true. Quando il valore di MapiConversionOptions.ForcedRtfBodyForAppointment se impostato su true, il corpo dell’appuntamento viene convertito in formato RTF. Per mantenere il formato del corpo dell’appuntamento in HTML, impostare il valore di MapiConversionOptions.ForcedRtfBodyForAppointment a false.

Il seguente esempio dimostra l’uso di MapiConversionOptions.ForcedRtfBodyForAppointment proprietà per mantenere il formato del corpo dell’appuntamento in 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");

Imposta manualmente lo stato degli elementi MAPI Calendar

Imposta lo stato di un oggetto MAPI Calendar esplicitamente, sovrascrivendo il comportamento predefinito. Questo consente un migliore controllo sugli stati degli eventi del calendario, particolarmente quando si gestiscono richieste di riunione ricevute. Per impostazione predefinita, quando viene creata una riunione, il suo stato è MapiCalendarState.Meeting. Quando ricevuto nella casella di posta del destinatario, cambia automaticamente in MapiCalendarState.Received, e la sua classe di messaggio è aggiornata a “IPM.Schedule.Meeting.Request”. Usando SetStateForced consente di impostare manualmente lo stato a Received, il che può essere utile per preservare le informazioni dell’organizzatore quando si salva il calendario come file MSG. Tuttavia, ciò può impedire il corretto inoltro o il rinvio della riunione.

Il esempio di codice sottostante dimostra come creare un MapiCalendar oggetto, assegna un organizzatore e imposta esplicitamente il suo stato a entrambi Meeting e Received usando SetStateForced. Quindi salva l’elemento del calendario come file .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);

Vedi anche