Správa schůzek: Vytváření a úpravy, převod ICS na MSG
Tento článek pokrývá standardně založené iCalendar (ICS) schůzky zpracovávané prostřednictvím Appointment třída. Pro práci s Outlook MapiCalendar položky místo toho, viz Správa položek kalendáře Outlook; pro ukládání a čtení položek kalendáře uvnitř PST, viz Správa položek kalendáře v souborech PST.
Vytvoření schůzky a uložení na disk ve formátu MSG nebo ICS
The Appointment třída v Aspose.Email pro .NET může být použita k vytvoření nové schůzky. V tomto článku nejprve vytvoříme schůzku a uložíme ji na disk ve formátu ICS. K vytvoření schůzky a uložení na disk jsou vyžadovány následující kroky.
- Vytvořte instanci Appointment třídu a inicializujte ji tímto konstruktorem.
- Předávejte následující argumenty do výše uvedeného konstruktoru
- Místo
- Shrnutí
- Popis
- Počáteční datum
- Datum konce
- Organizátor
- Účastníci
- Zavolejte Save() metodu a v argumentech zadejte název souboru a formát.
Schůzku lze otevřít v Microsoft Outlook nebo v jakémkoli programu, který dokáže načíst soubor ICS. Pokud je soubor otevřen v Microsoft Outlook, automaticky přidá schůzku do kalendáře Outlook.
Následující úryvek kódu ukazuje, jak vytvořit a uložit schůzku na disk ve formátu ICS nebo MSG.
// Create and initialize an instance of the Appointment class
Appointment appointment = new Appointment(
"Meeting Room 3 at Office Headquarters",// Location
"Monthly Meeting", // Summary
"Please confirm your availability.", // Description
new DateTime(2015, 2, 8, 13, 0, 0), // Start date
new DateTime(2015, 2, 8, 14, 0, 0), // End date
"from@domain.com", // Organizer
"attendees@domain.com"); // Attendees
// Save the appointment to disk in ICS format
appointment.Save(fileName + ".ics", new AppointmentIcsSaveOptions());
Console.WriteLine("Appointment created and saved to disk successfully.");
// Save the appointment to disk in MSG format
appointment.Save(fileName + ".msg", new AppointmentMsgSaveOptions());
Console.WriteLine("Appointment created and saved to disk successfully.");
Vytvořit schůzku s HTML obsahem
Můžete specifikovat alternativní reprezentace popisu události v různých typech obsahu pomocí hlavičky X-ALT-DESC. Umožňuje příjemcům iCalendar souboru vybrat reprezentaci, která nejlépe vyhovuje jejich potřebám. Například můžete zahrnout popis v prostém textu pomocí typu obsahu "text/plain" a HTML popis pomocí typu obsahu "text/html". Pro každou alternativní reprezentaci je přidána hlavička X-ALT-DESC. Pro vytvoření schůzky s HTML obsahem nastavte HtmlDescription vlastnost.
Vyzkoušejte následující ukázkový kód k vytvoření schůzky s alternativním HTML popisem:
- Vytvořte novou instanci třídy Appointment.
- Poskytněte potřebné parametry konstruktoru Appointment:
- Určete místo konání schůzky.
- Nastavte datum a čas začátku.
- Nastavte datum a čas konce.
- Určete organizátora.
- Určete účastníka.
- Nastavte HtmlDescription vlastnost objektu schůzky, která naznačuje, že popis je ve formátu HTML.
- Nastavte vlastnost Description objektu schůzky na HTML formátovaný řetězec uzavřený do víceřádkového řetězce:
- HTML značkování obsahuje blok <style> definující CSS třídu nazvanou "text" s fontovými styly.
- HTML tělo obsahuje značku odstavce <p> s CSS třídou "text" a skutečnou pozvánkovou zprávu.
- Objekt schůzky je nyní připraven a můžete provádět další operace nebo jej uložit jako soubor iCalendar.
var appointment = new Appointment("Bygget 83",
DateTime.UtcNow, // start date
DateTime.UtcNow.AddHours(1), // end date
new MailAddress("TintinStrom@from.com", "Tintin Strom"), // organizer
new MailAddress("AinaMartensson@to.com", "Aina Martensson")) // attendee
{
HtmlDescription = @"
<html>
<style type=""text/css"">
.text {
font-family:'Comic Sans MS';
font-size:16px;
}
</style>
<body>
<p class=""text"">Hi, I'm happy to invite you to our party.</p>
</body>
</html>"
};
Vytvořit požadavek na koncept schůzky
V našich předchozích článcích jsme ukázali, jak vytvořit a uložit schůzku ve formátu ICS. Často je potřeba vytvořit požadavek na schůzku v režimu konceptu, aby byla přidána základní informace a poté byl tento koncept předán dalším uživatelům k nezbytným úpravám podle individuálního použití. Pro uložení schůzky v režimu konceptu je nutné, aby MethodType vlastnost třídy Appointment by měla být nastavena na AppointmentMethodType.Publish. Následující úryvek kódu ukazuje, jak vytvořit koncept požadavku na schůzku.
string sender = "test@gmail.com";
string recipient = "test@email.com";
MailMessage message = new MailMessage(sender, recipient, string.Empty, string.Empty);
Appointment app = new Appointment(string.Empty, DateTime.Now, DateTime.Now, sender, recipient)
{
MethodType = AppointmentMethodType.Publish
};
message.AddAlternateView(app.RequestApointment());
MapiMessage msg = MapiMessage.FromMailMessage(message);
// Save the appointment as draft.
msg.Save(dstDraft);
Console.WriteLine(Environment.NewLine + "Draft saved at " + dstDraft);
Vytvoření konceptu schůzky z textu
Následující úryvek kódu ukazuje, jak vytvořit koncept schůzky z textu.
string ical = @"BEGIN:VCALENDAR
METHOD:PUBLISH
PRODID:-//Aspose Ltd//iCalender Builder (v3.0)//EN
VERSION:2.0
BEGIN:VEVENT
ATTENDEE;CN=test@gmail.com:mailto:test@gmail.com
DTSTART:20130220T171439
DTEND:20130220T174439
DTSTAMP:20130220T161439Z
END:VEVENT
END:VCALENDAR";
string sender = "test@gmail.com";
string recipient = "test@email.com";
MailMessage message = new MailMessage(sender, recipient, string.Empty, string.Empty);
AlternateView av = AlternateView.CreateAlternateViewFromString(ical, new ContentType("text/calendar"));
message.AlternateViews.Add(av);
MapiMessage msg = MapiMessage.FromMailMessage(message);
msg.Save(dataDir + "draft_out.msg");
Přizpůsobení schůzek
Nastavit stav účastníků schůzky
Aspose.Email pro .NET API vám umožní nastavit stav účastníků schůzky při vytváření odpovědní zprávy. Tím se do souboru ICS přidá vlastnost PARTSTAT.
DateTime startDate = new DateTime(2011, 12, 10, 10, 12, 11),
endDate = new DateTime(2012, 11, 13, 13, 11, 12);
MailAddress organizer = new MailAddress("aaa@amail.com", "Organizer");
MailAddressCollection attendees = new MailAddressCollection();
MailAddress attendee1 = new MailAddress("bbb@bmail.com", "First attendee");
MailAddress attendee2 = new MailAddress("ccc@cmail.com", "Second attendee");
attendee1.ParticipationStatus = ParticipationStatus.Accepted;
attendee2.ParticipationStatus = ParticipationStatus.Declined;
attendees.Add(attendee1);
attendees.Add(attendee2);
Appointment target = new Appointment(location, startDate, endDate, organizer, attendees);
Přizpůsobit identifikátor produktu pro iCalendar
Aspose.Email pro .NET API umožňuje získat nebo nastavit identifikátor produktu, který vytvořil objekt iCalendar.
string description = "Test Description";
Appointment app = new Appointment("location", "test appointment", description, DateTime.Today,
DateTime.Today.AddDays(1), "first@test.com", "second@test.com");
AppointmentIcsSaveOptions saveOptions = AppointmentIcsSaveOptions.Default;
saveOptions.ProductId = "Test Corporation";
app.Save(dataDir + "ChangeProdIdOfICS.ics", saveOptions);
Načítání schůzek
Také Appointment třída může být použita k načtení schůzky ze souboru ICS.
Načíst schůzku ve formátu ICS
Pro načtení schůzky ve formátu ICS jsou vyžadovány následující kroky:
- Vytvořte instanci Appointment třída.
- Zavolejte Load() metoda, která poskytuje cestu k souboru ICS.
- Přečtěte libovolnou vlastnost a získejte jakékoli informace z události (soubor ICS).
Následující úryvek kódu ukazuje, jak načíst schůzku ve formátu ICS.
// Load an Appointment just created and saved to disk and display its details.
Appointment loadedAppointment = Appointment.Load(dstEmail);
Console.WriteLine(Environment.NewLine + "Loaded Appointment details are as follows:");
// Display the appointment information on screen
Console.WriteLine("Summary: " + loadedAppointment.Summary);
Console.WriteLine("Location: " + loadedAppointment.Location);
Console.WriteLine("Description: " + loadedAppointment.Description);
Console.WriteLine("Start date: " + loadedAppointment.StartDate);
Console.WriteLine("End date: " + loadedAppointment.EndDate);
Console.WriteLine("Organizer: " + loadedAppointment.Organizer);
Console.WriteLine("Attendees: " + loadedAppointment.Attendees);
Console.WriteLine(Environment.NewLine + "Appointment loaded successfully from " + dstEmail);
Převod ICS na MSG
API vám umožňuje snadno převést schůzku na objekt zprávy. Následující příklad kódu ukazuje, jak převést požadavek na schůzku na MailMessage nebo MapiMessage:
var appointment = Appointment.Load("appRequest.ics");
var eml = appointment.ToMailMessage();
var msg = appointment.ToMapiMessage();
Číst více událostí ze souboru ICS
List<Appointment> appointments = new List<Appointment>();
CalendarReader reader = new CalendarReader(dataDir + "US-Holidays.ics");
while (reader.NextEvent())
{
appointments.Add(reader.Current);
}
//working with appointments...
Zapsat více událostí do souboru ICS
AppointmentIcsSaveOptions saveOptions = new AppointmentIcsSaveOptions();
saveOptions.Action = AppointmentAction.Create;
using (CalendarWriter writer = new CalendarWriter(dataDir + "WriteMultipleEventsToICS_out.ics", saveOptions))
{
for (int i = 0; i < 10; i++)
{
Appointment app = new Appointment(string.Empty, DateTime.Now, DateTime.Now, "sender@domain.com", "receiver@domain.com");
app.Description = "Test body " + i;
app.Summary = "Test summary:" + i;
writer.Write(app);
}
}
Zjištění verze schůzky
Pro určení verze schůzky můžete použít Appointment.Version vlastnost třídy Appointment třída. Tato vlastnost pomáhá určit, na jaké verzi jsou jejich soubory založeny, což zajišťuje integraci s ostatními systémy a aplikacemi.
Následující ukázkový kód ukazuje, jak implementovat tuto vlastnost ve vašem projektu:
var app = Appointment.Load("meeting.ics");
// Version is a string that holds the ICS/VCS version, e.g. "2.0" for iCalendar
if (app.Version == "2.0")
{
// do something
}
Odesílání a rušení žádostí o schůzky
The Appointment třídy, spolu s SmtpClient, lze použít k odesílání žádostí o schůzky, opakovaných žádostí, aktualizací a zrušení e‑mailem. Schůzka je přidána do MailMessage jako alternativní pohled.
Odeslat žádost o schůzku
Pro odeslání žádosti o schůzku vytvořte Appointment, přidejte ji k zprávě pomocí RequestApointment metodu a odešlete zprávu. Uložte UniqueId hodnotu, abyste mohli později odkazovat na stejnou schůzku při odesílání aktualizace nebo zrušení.
// Create an instance of SmtpClient
SmtpClient client = new SmtpClient("smtp.gmail.com", 587, "user@gmail.com", "password");
client.SecurityOptions = SecurityOptions.Auto;
// Gather the attendees
MailAddressCollection attendees = new MailAddressCollection();
attendees.Add(new MailAddress("first.attendee@domain.com", "First Attendee"));
attendees.Add(new MailAddress("second.attendee@domain.com", "Second Attendee"));
// Create the message and the appointment
MailMessage msg = new MailMessage();
msg.From = "organizer@domain.com";
msg.To = attendees;
Appointment app = new Appointment("Meeting Room 1", DateTime.Now, DateTime.Now.AddHours(1), msg.From, attendees);
app.Summary = "Monthly Meeting";
app.Description = "Please confirm your availability.";
// Add the appointment to the message and send it
msg.AddAlternateView(app.RequestApointment());
client.Send(msg);
Odeslat žádost o opakovanou schůzku
Pro vytvoření žádosti o schůzku s rekurencí přiřaďte rekurzivní vzor (například WeeklyRecurrencePattern) do Appointment.Recurrence vlastnost. Uložení unikátního ID schůzky umožňuje později odesílat aktualizace k schůzce.
// Create a mail message
MailMessage msg1 = new MailMessage();
msg1.To.Add("to@domain.com");
msg1.From = new MailAddress("from@gmail.com");
// Fill the appointment object
DateTime startDate = new DateTime(2013, 12, 1, 17, 0, 0);
DateTime endDate = new DateTime(2013, 12, 31, 17, 30, 0);
Appointment agendaAppointment = new Appointment("same place", startDate, endDate, msg1.From, msg1.To);
// Create a unique id so the appointment can be accessed later
string szUniqueId = Guid.NewGuid().ToString();
agendaAppointment.UniqueId = szUniqueId;
agendaAppointment.Description = "----------------";
// Create a weekly recurrence pattern: Mon, Tue and Thu
WeeklyRecurrencePattern pattern1 = new WeeklyRecurrencePattern(14);
pattern1.StartDays = new CalendarDay[3];
pattern1.StartDays[0] = CalendarDay.Monday;
pattern1.StartDays[1] = CalendarDay.Tuesday;
pattern1.StartDays[2] = CalendarDay.Thursday;
pattern1.Interval = 1;
// Set the recurrence pattern for the appointment
agendaAppointment.Recurrence = pattern1;
// Attach the appointment to the mail
msg1.AlternateViews.Add(agendaAppointment.RequestApointment());
// Send the mail with the appointment request
SmtpClient client = new SmtpClient("smtp.gmail.com", 587, "your.email@gmail.com", "your.password");
client.SecurityOptions = SecurityOptions.Auto;
client.Send(msg1);
Odeslat žádost o aktualizaci schůzky
Pro odeslání aktualizace dříve odeslané schůzky je vyžadováno unikátní ID schůzky. Použijte UpdateAppointment metoda pro vytvoření aktualizační alternativní pohledu.
static public void SendUpdate(string szUniqueId)
{
DateTime startDate = new DateTime(2013, 12, 12, 17, 0, 0);
DateTime endDate = new DateTime(2013, 12, 12, 17, 30, 0);
Appointment appUpdate = new Appointment("Different Place", startDate, endDate,
"organizer@gmail.com", "attendee@domain.com");
appUpdate.UniqueId = szUniqueId;
appUpdate.Summary = "update meeting request summary";
appUpdate.Description = "update";
MailMessage msgUpdate = new MailMessage("organizer@gmail.com", "attendee@domain.com",
"test email - update meeting request", "test email");
msgUpdate.AddAlternateView(appUpdate.UpdateAppointment());
SmtpClient smtp = new SmtpClient("server.domain.com", 587, "username", "password");
smtp.Send(msgUpdate);
}
Zrušit žádost o schůzku
Pro zrušení schůzky vytvořte stejnou Appointment (použitím informací, které jste uložili při odeslání požadavku), přidejte ji k zprávě pomocí CancelAppointment metoda a odešlete zprávu účastníkům.
// Re-create the attendee collection and the appointment from your stored data
MailAddressCollection attendees = new MailAddressCollection();
attendees.Add(new MailAddress("first.attendee@domain.com", "First Attendee"));
attendees.Add(new MailAddress("second.attendee@domain.com", "Second Attendee"));
Appointment app = new Appointment("Meeting Room 1", "Monthly Meeting", "Please confirm your availability.",
DateTime.Now, DateTime.Now.AddHours(1),
new MailAddress("organizer@domain.com", "Organizer"), attendees);
// Create the cancellation message
MailMessage msg = new MailMessage();
msg.From = new MailAddress("organizer@domain.com", "");
msg.To = attendees;
msg.Subject = "Cancel meeting";
msg.AddAlternateView(app.CancelAppointment());
SmtpClient smtp = new SmtpClient("smtp.gmail.com", 587, "user@gmail.com", "password");
smtp.Send(msg);
Práce s rekurzivními vzory iCalendar
Rekurzivní vzor je způsob, jak popsat konkrétní rozvrh. Obsahuje právě tolik informací, kolik stačí k vytvoření seznamu výskytů (dat a časů) podle daného rozvrhu. Rekurzivní vzor může obsahovat rekurzivní pravidla, která popisují cykly spojující se do celkového vzoru. Obecně čím složitější rekurzivní vzor, tím více rekurzivních pravidel bude obsahovat.
Rekurzivní vzory mohou obsahovat výjimky (nesmíte si je splést s výjimkami představujícími chyby během provádění aplikace). Výjimky přidávají nebo odstraňují data výskytů relativně k původnímu vzoru. Mohou být zadány jako explicitní výskyty nebo jako samostatný vzor. Příklady rekurzivních vzorů s výjimkami:
- Každý druhý pátek, kromě období od června do srpna.
- První den každého měsíce, kromě ledna, kdy má být druhý.
RFC iCalendar definuje komponenty, jako VEVENT nebo VTODO, které představují události nebo úkoly. Komponenty mohou mít vlastnosti jako datum/čas začátku, popis, místo, účastníci a rekurze. Rekurzivní vzor obvykle existuje jako vlastnost opakujícího se úkolu nebo události. Vlastnosti rekurzivního vzoru definované iCalendar jsou:
- DTSTART – datum a čas začátku vzoru (také představuje první výskyt, pokud není výslovně vyloučen).
- RRULE – specifikuje opakující se pravidlo pro rekurzní soubor.
- RDATE – definuje seznam dat a časů, které mají být zahrnuty do rekurzního souboru.
- EXRULE – specifikuje opakující se pravidlo pro výjimky z recurzního souboru.
- EXDATE – definuje seznam výjimek data a času z recurzního souboru.
Vyžaduje se pouze DTSTART a musí být pouze jeden. Všechny ostatní vlastnosti jsou volitelné a lze je zadat vícekrát.
Model objektů rekurze Aspose.Email
The Aspose.Email.Calendar.Recurrences jmenný prostor obsahuje třídy používané pro práci s rekurencemi iCalendar. CalendarRecurrence a RecurrenceRule jsou ústřední třídy a poskytují konkrétní implementace odpovídajících prvků RFC 2445.
- The
CalendarRecurrencetřída představuje celý rekurzivní vzor. Můžete vytvořit nový rekurzivní vzor od začátku pomocí výchozího konstruktoru nebo načíst existující vzor ve formátu iCalendar pomocí statickéFromiCalendarmetoda. - The
RecurrenceRuletřída představuje část RRULE nebo EXRULE opakovacího vzoru.RecurrenceRuleodhaluje řadu vlastností, které přímo mapují na jejich protějšky ve standardu iCalendar. NapříkladByMonthmapuje na BYMONTH v iCalendar a tak dále. Zkoumáním nebo nastavením hodnotRecurrenceRulevlastnosti, můžete analyzovat nebo upravovat rekurzivní pravidlo.
Následující úryvek kódu načte rekurzivní vzor (kde část RRULE obsahuje pravidlo rekurze) a vygeneruje výskyty:
// Ten team meetings, every Monday at 10am.
CalendarRecurrence pattern = new CalendarRecurrence("DTSTART:20040301T100000\n" + "RRULE:FREQ=WEEKLY;COUNT=10;BYDAY=MO");
DateCollection dates = pattern.GenerateOccurrences();
Generovat výskyty z rekurzivního vzoru
S Aspose.Email je možné generovat výskyty z rekurzivního vzoru. Pro získání „dalšího“ výskytu použijte GenerateOccurrences metody s parametrem nNextOccurrences = 1. Následující úryvek kódu generuje 20 výskytů pomocí GenerateOccurrences(20).
CalendarRecurrence recurrencePattern = new CalendarRecurrence();
recurrencePattern.StartDate = new DateTime(1997, 9, 10, 9, 0, 0);
RecurrenceRule rule = recurrencePattern.RRules.Add();
rule.Frequency = Frequency.Monthly;
rule.Count = 20;
rule.Interval = 18;
rule.ByMonthDay.Add(new int[] { 10, 11, 12, 13, 14, 15 });
DateCollection expectedDates = recurrencePattern.GenerateOccurrences(20);
Console.WriteLine("expectedDates.Count = " + expectedDates.Count);
foreach (DateTime date in expectedDates)
{
Console.WriteLine("DateTime = " + date);
}
Získat uživatelsky přívětivý text pro rekurzi
Uživatelsky přívětivý text pro pravidlo lze získat pomocí FriendlyText vlastnost. Výstup následujícího kódu je: „Rekurzivně každý měsíc 1. a 1. od konce dne měsíce maximálně 2 výskyty.“
RecurrenceRule rule = new RecurrenceRule();
rule.Frequency = Frequency.Monthly;
rule.Count = 2;
rule.ByMonthDay.Add(1);
rule.ByMonthDay.Add(-1);
Console.WriteLine(rule.FriendlyText);
Ukázkové rekurzivní vzory
Následující ukázkové řetězce RRULE ilustrují, jak vyjádřit běžné rozvrhy.
-
Poslední den v měsíci, každý měsíc. Pokud chcete instanci den před posledním dnem v měsíci, použijte
BYMONTHDAY=-2. Pokud zadáteBYMONTHDAY=31, pak podle standardu iCalendar není v měsících s méně než 31 dny generována žádná instance.RRULE:FREQ=MONTHLY;BYMONTHDAY=-1 -
Poslední pracovní den každého měsíce. Toto pravidlo určuje všechny pracovní dny měsíce a vybírá z nich poslední. Výsledkem je poslední pracovní den v měsíci.
RRULE:FREQ=MONTHLY;BYDAY=MO,TU,WE,TH,FR;BYSETPOS=-1 -
Poslední pondělí roku.
RRULE:FREQ=YEARLY;BYDAY=-1MO -
Pátek první ISO 8601 týdne roku. V specifikaci ISO 8601 je první týden roku ten, který má alespoň čtyři dny.
FREQ=YEARLY;BYWEEKNO=1;BYDAY=FR -
První pátek roku. V roce 1999 je například první pátek roku 1999/01/01, zatímco pátek první ISO 8601 týdne je 1999/01/08.
FREQ=YEARLY;BYDAY=1FR
Důležité podrobnosti iCalendar (RFC 2445)
Data nebo data s přidruženými časy lze použít v prvcích DTSTART, UNTIL, EXDATE a RDATE při specifikaci rekurzivního vzoru. iCalendar definuje typ hodnoty DATE pro identifikaci hodnot obsahujících kalendářní datum a typ DATE‑TIME pro identifikaci hodnot, které specifikují přesné kalendářní datum a čas během dne. Hodnoty DATE‑TIME lze zadat ve třech formách: místní čas, UTC čas a místní čas s časovým pásmem.
- DATE. Podle standardu iCalendar musí hodnoty DATE následovat
yyyyMMddformát. Například19970714reprezentuje 14. července 1997. - DATE‑TIME s místním časem. Forma data‑času s místním časem je jednoduše hodnota data‑času, která neobsahuje značení UTC a neodkazuje na časové pásmo. Například
DTSTART:19980118T230000reprezentuje 18. ledna 1998, 23 hodiny. Hodnoty data‑času tohoto typu se nazývají „plovoucí“ a nejsou vázány na konkrétní časové pásmo. Reprezentují stejnou hodinu, minutu a sekundu bez ohledu na aktuálně pozorované časové pásmo. - DATE‑TIME s UTC časem. Datum s UTC časem (absolutní čas) je označeno velkým písmenem
Zpřipojenou k hodnotě času. NapříkladDTSTART:19980119T070000Zreprezentuje 19. ledna 1998, 07:00 UTC. Všimněte si, že Aspose.Email ignoruje příponuZpřípona a považuje čas za místní čas. Standard RFC 2445 uvádí, že časová část uvedená v pravidle UNTIL rekurzivního vzoru musí být ve formátu UTC; Aspose.Email přijímá čas v libovolném formátu v pravidle UNTIL. - DATE‑TIME s místním časem a časovým pásmem. Pro odkaz na časové pásmo se DATE‑TIME upravuje vlastností TZID. Například
DTSTART;TZID=US-Eastern:19980119T020000reprezentuje 2 ráno v New Yorku 19. ledna 1998. Všimněte si, že Aspose.Email v současnosti ignoruje parametr TZID a považuje čas za místní čas. - Soulad s BYWEEKNO a ISO 8601. Používejte BYWEEKNO jen pokud je požadována ISO 8601 je vyžadováno. Čísla týdnů podle ISO 8601 se liší od běžného vnímání čísel týdnů: první týden kalendářního roku je první týden, který obsahuje alespoň čtyři dny. Pravidlo BYWEEKNO udává seznam čísel oddělených čárkou, který identifikuje týdny roku (platné hodnoty jsou 1‑53 a ‑1‑‑53) a je platné pouze pro roční pravidla.
Viz také
- Správa položek kalendáře Outlook — vytvářet a spravovat položky kalendáře jako Outlook
MapiCalendar(MSG) objekty. - Správa položek kalendáře v souborech PST — ukládat a číst položky kalendáře uvnitř PST.