skok na hlavní menu | menu sekce Aktuality

Úvod » Aktuality » Synchronizace kalendářů s WebCal

Synchronizace kalendářů s WebCal

V našem firemním informačním systému používáme kalendář, který je potřeba synchronizovat s kalendářem našich pracovníků v Outlooku. V tomto článku vás seznámíme s jednoduchou a efektivní metodou, která tuto synchronizaci provádí.


Zadání

Informační systém obsahuje kalendář s naplánovanou prací továrníkům, ten je potřeba pravidelně synchronizovat s kalendářem v Outlooku. Synchronizace je jednosměrná, v Outlooku není možné tento kalendář nijak měnit. Synchronizovat by se mělo ideálně vždy po změně kalendáře, což se děje alespoň jednou za hodinu.

Způsoby implementace

Možností je několik, jejich společným jmenovatelem je formát iCalendar (přípona .ics), což je standard formátu souborů pro synchronizaci kalendářů.

E-mail s aktualizací událostí

Po změně kalendáře v ISu se odběratelům rozešlou emaily s přílohou ve které budou aktualizace kalendáře. Původně jsme implementovali tuto variantu, setkali jsme se ale se třemi problémy:

  • V Outlooku (2007) není možné nastavit automatický příjem událostí pro určitého odesilatele, pouze globálně.
  • Nepodařilo se nám vytvořit přílohu, která obsahuje více událostí v jednom souboru (nějak to ale určitě jde).
  • Události se přidávají do hlavního uživatelského kalendáře, ne do vlastního.

E-mail s celým kalendářem

Pošleme celý kalendář vyexportovaný jako .ics soubor v příloze mailu.

  • Uživatel si jej musí ručně importovat do Outlooku.
  • Nemíchá se s jinými událostmi do hlavního kalendáře tak, jako předchozí varianta.

WebCal „protokol“

Outlooku předáme odkaz na .ics soubor s kalendářem, který si jej pak periodicky stahuje. Na serveru tedy stačí vytvářet na určité adrese iCalendar soubor, nikam jej nemusíme posílat. Stahování, resp. kontrola změny souboru, probíhá společně s kontrolou poštovní schránky, RSS kanálů atp., tedy např. při stisknutí klávesy F9.

Nevýhodou tohoto řešení je fakt, že podpora WebCal formátu je přítomna v Outlooku až od verze 2007.

Další potenciální problém je v tom, že kalendář je volně přístupný na webu nebo síti – Outlook jej musí být schopen stáhnout bez jakékoli autentizace. V našem ISu toto řešíme tak, že adresa kalendářů je tajná a neuhodnutelná.

Z názvu článku je asi patrné, že jsme se rozhodli pro tuto variantu.

Formát souboru

Formát souboru je standardní iCalendar. Přestože se jedná o zavedený a veřejný standard, jeho použití je často problematické. Při ladění jsme se mnohokrát setkali se situací, kdy ostatní programy soubor akceptovaly, Outlook ale ne a jeho chybové hlášky moc nápomocné nebyly. Je proto dobré se držet otestovaných řešení, jako je např. toto.

Obecně

Obsah souboru se skládá ze dvou částí – hlavičky týkající se celého kalendáře a výpisu úkolů. Toto je samozřejmě zjednodušení, které si můžeme dovolit pouze pro naši aplikaci.

Soubor se skládá ze dvojic JMÉNO:HODNOTA. Pokud hodnota obsahuje delší text, je nutné jej rozdělit na řádky po 75 znacích, každý nový řádek musí začínat mezerou (tím dáváme najevo, že hodnota pokračuje).

V následujících ukázkách počítejte s tím, že text od výskytu znaku # až po konec řádku je komentář, který v souboru neexistuje.

Hlavička

Hlavička i patička jsou v souboru přirozeně pouze jednou.

BEGIN:VCALENDAR
PRODID:-//Tovarna//IS//EN      # Aplikace generující kalendář
VERSION:2.0                    # Odlišuje od předchozího standardu vCalendar
CALSCALE:GREGORIAN             # Nastavuje Gregoriánský kalendář. Nic jiného asi ani není podporováno.
METHOD:PUBLISH
X-WR-CALNAME:IS                # Jméno kalendáře - tak, jak se zobrazuje v Outlooku
X-WR-TIMEZONE:Europe/Belgrade  # Časová zóna

Úkol

Úkolů může být v souboru libovolné množství. Formát času je v iCalendar souborech trochu netypický: 20100103T163815Z znamená 3. leden 2010 16:38:15 UTC (znak Z na konci). Specifikace sice někde umožňuje použití i lokálního času, my ale pracujeme pouze s poli, které musí obsahovat data v UTC.

BEGIN:VEVENT
ATTENDEE;CN=t@tovarna.cz;RSVP=TRUE:mailto:t@tovarna.cz
ORGANIZER;CN="IS":mailto:is@tovarna.cz
CLASS:PUBLIC
CREATED:20100103T163815Z                # Datum vytvoření události
DTSTAMP:20100103T163815Z                # Pro naše potřeby řekněme, že to samé jako CREATED
DTEND:20100104T110048Z                  # Datum konce události
DTSTART:20100104T080048Z                # Započetí události
LAST-MODIFIED:20100103T163815Z          # Datum poslední modifikace
SEQUENCE:0                              # Pro nás nezajímavé
SUMMARY;LANGUAGE=cs:Krátký popis        # Krátký popis
DESCRIPTION:Odkaz: http://localhost/ng/public/id/60
 Delší popis události na více řádků.
 Je nutné na začátek přidat mezeru.
TRANSP:OPAQUE                           # Říká, že událost spotřebovává čas/prostředky
UID:01IBEH1BT3OK7I3I2SJXEKP5LVT3ODM13   # Unikátní ID pro identifikaci Outlookem
X-MICROSOFT-CDO-BUSYSTATUS:BUSY         # Jedná se o práci nebo volno?
END:VEVENT

Patička

END:VCALENDAR

Kód v PHP

// Formátuje timestamp na iCalendar formát
function icalDatetime($timestamp)
{
        return strftime("%Y%m%dT%H%M%S", $timestamp);
}

// Rozseká text na řádky po 75 znacích
function prepareText($text)
{
        return chunk_split($text, 75, "
 ");
}

define("TIMEZONE_OFFSET", 3600); // ČR je +1 od UTC

$content = "BEGIN:VCALENDAR
PRODID:-//Tovarna//IS//EN
VERSION:2.0
CALSCALE:GREGORIAN
METHOD:PUBLISH
X-WR-CALNAME:IS
X-WR-TIMEZONE:Europe/Belgrade";

foreach($events as $ev)
        $content .= "
BEGIN:VEVENT
ATTENDEE;CN=".$user["email"].";RSVP=TRUE:mailto:".$user["email"]."
ORGANIZER;CN="IS":mailto:is@tovarna.cz
CLASS:PUBLIC
CREATED:".icalDatetime(time() - TIMEZONE_OFFSET)."Z
DTEND:".icalDatetime($ev["end"] - TIMEZONE_OFFSET)."Z
DTSTAMP:".icalDatetime(time() - TIMEZONE_OFFSET)."Z
DTSTART:".icalDatetime($ev["begin"] - TIMEZONE_OFFSET)."Z
LAST-MODIFIED:".icalDatetime(time() - TIMEZONE_OFFSET)."Z
SEQUENCE:0
SUMMARY;LANGUAGE=cs:".prepareText($summary)."
DESCRIPTION:".prepareText($description)."
TRANSP:OPAQUE
UID:".generateUID()."
X-MICROSOFT-CDO-BUSYSTATUS:BUSY
END:VEVENT";

$content .= "
END:VCALENDAR";

/*
 * Jako jméno je použit SHA1 hash kvůli bezpečnosti. Soubor musí být k dispozici
 * ke stáhnutí, ale jen se znalostí správné adresy.
 */

file_put_contents(ICALENDAR_DIR . "/" . sha1($user) . ".ics", $content);

Publikace a import do Outlooku

Předpokládejme, že máme kalendář vygenerovaný ve formátu iCalendar na URL: http://example­.org/kalendar­.ics

Máme dvě možnosti, jak na něj odkazovat:

  • http://example­.org/kalendar­.ics – po otevření odkazu Outlook soubor stáhne a jednorázově importuje. Už se ale k němu nevrací.
  • webcal://exam­ple.org/kalen­dar.ics – po otevření odkazu nabídne Outlook možnost se přihlásit ke kalendáři. Outlook pak pravidelně stahuje novou verzi souboru.

webcal:// je neoficiální URI schéma, které prohlížeči říká, že soubor nemá stahovat, ale radši poslat asociované aplikaci odkaz.

Odkazy




Poslat článek Nahoru



TOVARNA.CZ, s.r.o.

E-mail: info@tovarna.cz
Telefon: +420 604 209 876
(Daniel Handl)

Kancelář Praha

Doubravčická 1474/21
100 00 Praha 10
Telefon: +420 274 776 344