V kalendáři MS Outlook můžeme vytvářet události (Appointment) nebo schůzky (žádost o schůzku - Meeting Request). Schůzka se liší tím, že jsou přizvány další osoby - účastníci (Attendees) nebo zdroje (Resources). Ten, kdo ji vytváří, je organizátor (Organizer).
Každou událost/schůzku z kalendáře můžeme uložit jako zprávu (msg), iCalendar formát (ics) nebo vCalendar formát (vcs). Stačí ji v kalendáři vybrat a v menu zvolit File - Save As
, zde zadáme jméno a typ v jakém chceme uložit. Případně je tu ještě varianta, když otevřeme událost, tak se pod Forward skrývá možnost Forward as iCalendar
.
Formát pro výměnu kalendářových dat
vCalendar
Internet Mail Consortium (IMC) vytvořilo souborový formát vCalendar (VCS) pro výměnu kalendářových dat (často byl spojován s programem Microsoft Outlook). Jde o textový soubor, který začíná označením:
BEGIN:VCALENDAR VERSION:1.0
iCalendar
Dnes se používá jeho nástupce formát iCalendar (ICS), který je popsán v RFC 5545 a doplňcích. Je podporován řadou produktů, jako je Google Calendar, Apple Calendar, využívá ho i Microsoft Outlook, který jej lehce upravil. Soubor začíná:
BEGIN:VCALENDAR VERSION:2.0
Pomocí iCalendar formátu můžeme uložit událost i schůzku. Schůzka obsahuje (mimo řady dalších parametrů)
METHOD:REQUEST
Jednoho nebo více účastníků
ATTENDEE;CN="Bouška Petr";RSVP=TRUE:mailto:bouska@firma.cz
A případně organizátora
ORGANIZER;CN="Bouška Petr":mailto:bouska@firma.cz
Posílání událostí
Jako příloha zprávy
Událost či schůzku ve formátu iCalendar můžeme poslat jako přílohu emailu. Tu můžeme otevřít a událost pomocí Save & Close
uložit do kalendáře. U schůzky máme tlačítka Accept
, Decline
, atd. a schůzka se standardně rovnou při zpracování vloží do kalendáře jako Tentative.
Automatické zpracování žádosti o schůzku
Kdy přesně dochází k automatickému zpracování žádosti o schůzku, mi není úplně jasné. Patrně, když je žádost jako příloha, tak se zpracovává až při otevření. Pokud je v těle zprávy, tak při příchodu na server.
Vypnout či zapnout zpracování (detaily mi nejsou jasné) můžeme v nastavení MS Outlook.
File - Options - Mail - Tracking - Automatically process meeting requests and responses to meeting requests and polls
Ale i když máme Outlook vypnutý, tak se událost vloží do kalendáře, takže jde o zpracování na serveru. Na Exchange serveru se nachází různá nastavení a pro uživatele si můžeme vypsat dvě hodnoty:
[PS] C:\>Get-CalendarProcessing uzivatel | FL AutomateProcessing AutomateProcessing : AutoUpdate [PS] C:\>Get-CalendarProcessing uzivatel | FL AddNewRequestsTentatively AddNewRequestsTentatively : True
V těle zprávy
Druhá možnost je, že schůzka je vložena přímo ve zprávě (u události to patrně nefunguje - přijde zvláštní zpráva, kterou můžeme otevřít, a pak již se chová normálně). Tímto způsobem odchází pozvánka při vytvoření v Outlooku a příjemci se zobrazí speciální zpráva (nemá ikonku emailu, ale kalendářové schůzky), kde máme rovnou k dispozici tlačítka pro Accept
, Decline
a vidíme náhled do kalendáře.
Když chceme odeslat iCalendar soubor v těle mailu, tak to patrně ručně (třeba v Outlooku) neuděláme. Jde to řešit programově. Zpráva se odesílá pomocí rozšířeného formátu MIME (Multipurpose Internet Mail Extensions). Určujeme parametry v hlavičce MIME-Version: 1.0.
Může obsahovat více částí Content-Type: multipart/alternative;
a má nastaven atribut Content-class: urn:content-classes:calendarmessage
. V těle zprávy (jako jedna část) je pak obsah ICS souboru s parametry Content-Type: text/calendar; name="meeting.ics"; method=REQUEST; Content-Transfer-Encoding: 8bit
.
Odeslání žádosti o schůzku pomocí skriptu
Pomocí PHP
Nejprve jsem chtěl použít PHP, kde jsem čekal, že vytvoření skriptu bude jednoduché. Ale stále se mi nedařilo, ani při použití různých návodů na internetu, například Sending Outlook/Email Calendar Events with PHP.
Nevím, jestli mám chybu ve správném nastavení parametrů MIME zprávy, nebo v obsahu iCalendar souboru. Výsledkem vždy bylo, že přišla zpráva, která měla přílohu s názvem not supported calendar message.ics
. Tato příloha šla normálně otevřít a byla zde funkční pozvánka.
Pozn.: Každopádně Outlook/Exchange je na formát ICS souboru dost náchylný a řada věcí nám může dělat problém. Například při funkčním posílání, když jsem měl parametr ORGANIZER pouze s emailem bez CN, tak také přišla pozvánka v příloze.
Pomocí Perlu
Našel jsem zajímavý článek, kde je uvedený skript v Perlu a ten se mi rychle podařilo zprovoznit. Jde o Exchange compatible iCal invitations. Co bylo potřeba udělat pro zprovoznění na Windows:
- stáhnout a nainstalovat ActivePerl, použil jsem soubor
ActivePerl-5.22.0.2200-MSWin32-x86-64int-299195.msi
- stáhnout Email-Date-Format-1.005.tar.gz a MIME-Lite-3.030.tar.gz a rozbalit složky
lib
se svým obsahem do instalace Perlu (standardněc:\Perl
), tím se přidají dvě potřebné knihovny - uložit Perlový skript do souboru, třeba
ical.pl
, a testovací iCalendar dosubject.ics
- zavolat skript z příkazové řádky v adresáři, kde je uložen skript,
d:\>perl ical.pl
Použitý skript ical.pl
je z výše uvedeného webu (je potřeba změnit adresu From, To a mail server):
#!/usr/bin/perl -w use strict; use MIME::Lite; my $msg = MIME::Lite->new( From =>'organizator@firma.cz', To =>'ucastnik@firma.cz', Subject =>'Test iCalendar', Type =>'multipart/alternative' ); $msg->attr( 'content-class' => 'urn:content-classes:calendarmessage' ); $msg->attach( Type => "TEXT", Data => "Test iCal" ); my $part = MIME::Lite->new( Type=> "text/calendar; method=REQUEST; name=\"subject.ics\"", Filename => "subject.ics", Path=> "subject.ics", Encoding => "8bit", ); $part->scrub(['date', 'x-mailer', 'mime-version']); $part->attr( 'content-class' => 'urn:content-classes:calendarmessage', 'content-description' => "subject.ics", ); $part->replace( 'content-disposition' => "", ); $msg->attach($part); $msg->send('smtp','IP.adresa.mail.serveru', Debug=>1);
Vlastní pozvánku můžeme vytvořit v Outlooku a uložit, pak se dá textový soubor jednoduše editovat. Příklad souboru subject.ics
(minimálně je potřeba změnit Attendee):
BEGIN:VCALENDAR PRODID:-//Microsoft Corporation//Outlook 14.0 MIMEDIR//EN VERSION:2.0 METHOD:REQUEST X-MS-OLK-FORCEINSPECTOROPEN:TRUE BEGIN:VTIMEZONE TZID:Central Europe Standard Time BEGIN:STANDARD DTSTART:16011028T030000 RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10 TZOFFSETFROM:+0200 TZOFFSETTO:+0100 END:STANDARD BEGIN:DAYLIGHT DTSTART:16010325T020000 RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=3 TZOFFSETFROM:+0100 TZOFFSETTO:+0200 END:DAYLIGHT END:VTIMEZONE BEGIN:VEVENT ATTENDEE;CN="Ucastnik";RSVP=TRUE:mailto:ucastnik@firma.cz CLASS:PUBLIC CREATED:20151022T131746Z DESCRIPTION:Schuzka DTEND;TZID="Central Europe Standard Time":20151023T235900 DTSTAMP:20151022T101820Z DTSTART;TZID="Central Europe Standard Time":20151023T000000 LAST-MODIFIED:20151022T131746Z PRIORITY:5 SEQUENCE:0 SUMMARY;LANGUAGE=cs:Schuzka TRANSP:OPAQUE UID:ok2015102300000020151023000000 X-MICROSOFT-CDO-BUSYSTATUS:TENTATIVE X-MICROSOFT-CDO-IMPORTANCE:1 X-MICROSOFT-CDO-INTENDEDSTATUS:OOF X-MICROSOFT-DISALLOW-COUNTER:FALSE X-MS-OLK-AUTOFILLLOCATION:TRUE X-MS-OLK-AUTOSTARTCHECK:FALSE X-MS-OLK-CONFTYPE:0 END:VEVENT END:VCALENDAR
Různé situace žádosti o schůzku
Řešil jsem situaci, kdy aplikace posílá nějakou událost do kalendáře. Nikde jsem nenalezl, co by měl být správný způsob. Jednoduchá metoda je poslat v příloze ICS soubor pro událost. Uživatel otevře přílohu, uloží a má událost v kalendáři. Vše je jednoduché a funguje. Ale problém je, když potřebujeme, aby se alespoň nějaká informace objevila v kalendáři, i když uživatel třeba týden neotevře poštu.
V takovém případě se hodí pozvánka ke schůzce, kterou pošleme v těle zprávy. Server ji pak zpracuje hned po přijetí a standardně vloží uživateli do kalendáře. Když uživatel zprávu otevře, tak má možnost zvolit Accept a tím schůzku potvrdit. Teď ale nastává otázka, kdo by v takovém případě měl být organizátor schůzky, jinak řečeno z jaké adresy má žádost přijít. V různých případech se totiž na tu adresu odesílá odpověď (třeba při akceptování). Můžeme použít neexistující adresu, ale tím budou vznikat chyby. Nějakou umělou schránku, kde se budou hromadit zprávy. V obou případech bude u schůzky vidět i tato adresa. Poslední možnost je použít adresu příjemce. To ale možná není správné řešení, protože občas nastává problém (viz. dále).
Nastavování organizátora a účastníka
Zajímavé je chování v Outlooku, když se různě kombinuje emailová adresa odesílatele s parametry v ICS souboru (ORGANIZER, ATTENDEE). Pokud se parametr ORGANIZER nezadá, tak se použije odesílatel emailu. Pokud je odesílatel jiný než ORGANIZER, tak jsem na internetu četl, že taková pozvánka nefunguje (přijde v příloze). Mě to ale zafunguje a Outlook ukazuje jako odesílatele osobu z ORGANIZER (pouze v hlavičce emailu je vidět, že ji odeslal někdo jiný).
Schůzka, kde jsem organizátor i účastník
Pokud v kalendáři Outlooku vytvořím schůzku a sám sebe přizvu jako účastníka, tak mi příchozí email hned spadne do smazaných zpráv a vidíme u něj informaci, že jsme organizátorem.
As the meeting organizer, you do not need to respond to the meeting.
Pokud vytvořím ICS soubor, kde sebe zadám jako ORGANIZER, tak při otevření se také uvádí, že jsem organizátorem a nemám k dispozici tlačítka pro akceptaci. Ale pokud takový ICS soubor pošlu, třeba pomocí Perlového skriptu, v těle emailu, tak vše funguje. Pozvánku mohu akceptovat a vloží se mi do kalendáře. Tedy takto funkční je v řadě prostředí, kde jsem testoval s Exchange Server 2010 a 2013. Ale v jedné infrastruktuře s Exchange Server 2013 to nefunguje a email končí v koši. Nepodařilo se mi zjistit, co takové chování způsobuje.
Jedna z věci co není zmíněna je standard CardDAV a CalDAV pro výměnu kontaktů a kalendářů. Bohužel není podporován přímo Outlookem a je nutno využít nějakou jinou aplikaci (například EVO Collaborator) pro přidání této funkce, která pak dovoluje synchronizaci například s Gmailem, iCloud a jinými.
Zdravim,
rad bych se optal, zda jste se nekdy setkal s problemem samovolne odesilanych pozvanek do kalendare (Outlook). Ted poprve v zivote se mi to stalo a odesila se to pomerne hodne a jednatel firmy, kam to chodi, uz je dost nervozni. Nasi IT se s tim nikde nesetkali. Z kalendare jsem tento invitation natvrdo smazal a od vcerejsiho vecera se to odeslalo uz opet 15x ... zadny reminder nastaveny nemam a je to jediny email, na ktery se to odesila, nikomu jinemu ne.
Moc diky za jakekoliv vstupy i odpoved na email milos.kucera@cz.abb.com
Pekny den preji
Milos kucera
Dobrý den mám dotaz jak potvrdím učast schůzky meetingu třeba ?
odpověď na [1]Jakub: Diky za info. Vyzkousel jsem a funguje super - pouzivam na synchronizaci firemního kalendare v Kerio se soukromym Google kalendářem. Pokud by někdo hledal jak nastavit, tak info jsem nasel třeba zde http://pocitace-a-internet.blogspot.com/2015/03/synchronizace-kontaktu-kalendare-gmailu.html