Outlook Kalender Termine auf Webserver veroeffentlichen
download
Termine (inclusive Serientermine) mittels voll automatisierbarem VBscript aus einem Outlook (2003) Kalender extrahieren und in CSV-Datei zur Weiterbearbeitung bereitstellen und veröffentlichen dieser Daten als navigierbarer Monatskalender auf einem Webserver
Automizable Visual Basic script to extract outlook 2003 appointment items (personal calendar) into CSV-file - publishing this data in an web based calendar. Includes (nearly) all possible recurrence types of appointmentItems with handling exceptions too (deleted or modified instances of recurrence appointment items) (Sorry - further documentation in german language only!)...
update 05/2012:
- funktioniert auch in Outlook 2010 noch
- für die Gegenrichtung interessant (Ermittlung für beliebige Jahre / Import von Feiertagen, Mondphasen, Dämmerungszeiten, Sonnenaufgangszeiten, Sonnenuntergangszeiten in Outlook) https://galupki.de/kalender/sunmoon.php
Todo:
---
Wieso eigentlich?
- Webzugriff von überall her auf die eigenen aktuellen Outlookdaten ohne andere Tools / Exchange (z.B. Stichwort ''Outlook Web Access'' (OWA))
- Voll automatisiertes veröffentlichen von Outlook-Terminen auf einen Webspace
- Einige Terminarten (z.B. Ostern, abhängig von Ostern) kennt Outlook nicht (kann man einzeln über Dateien importieren, klar)
- Jubiläumsangaben (z.B. welches Jubiläum bei Hochzeitstag, Alter bei Geburtstagen) zeigt Outlook nicht an
- Ich finde die normale Outlook-Monatsansicht des Kalenders recht unübersichtlich
- Unterwegs (ohne PDA für ActiveSync oder Outlook-Web-Zugriff z.B. via Exchange) können Termine (vor-)erfasst - und später durch einen einfachen Klick ins Outlook \"vor Ort\" übernommen werden
Den Web-Monatskalender kann man prima mittels activeDesktop(?) in jeweils aktueller Form angezeigen lassen (Desktop-Hintergrund). Bei der Suche nach fertigen OpenSource Scripts zum exportieren haperte es immer an der ein- oder anderen Stelle. Insbesondere die Serientermine werden da - selbst bei HowTo-Artikeln auf MS-Webseiten - recht stiefmütterlich behandelt (entweder wurden nur ganz simple Serientermine - z.B. jährliche Wiederholungen - wenn überhaupt - mit extrahiert, oder die Scripte agierten schlicht fehlerhaft
Beispielscript aus MS Technet - Retrieving a List of Recurring Appointments from Microsoft Outlook).
Prinzipielle Funktionsweise
- alle Termine des persönlichen Outlookkalenders werden mittels VBscript in eine Datei extrahiert
- dieser Roh-Datenextrakt wird auf einen Webspace transportiert
- umsetzen des Datenextraktes mit einem php-Script, dabei Selektionen und Abgleich mit webbasierter Datenquelle möglich
- Visualisierung der Termindaten (notwendig hierzu zusätzlich: die Kalenderbibliotheken Beispiel Terminkalenderanzeige)
Features des Datenextrakt-Scripts aus Outlook mit VBscript (Visual Basic Script)
- realisiert durch ein VBscript / Windows Scripting Host 5.6 (getestet mit WinXP SP2, Outlook 2003)
- es werden keine sicherheitskritischen Daten (im Sinne von Outlook-Schutzfunktionen, z.B. Body der Termine, Meetingpartner bei Besprechungen) ermittelt / gezogen, damit keine Sicherheitsnachfrage ausgelöst wird (würde dann alternativ weitergehende Techniken erfordern um trotzdem eine Automatisierung des gesamten Prozesses zu ermöglichen)
- es werden grundsätzlich alle gespeicherten Termine (auch Serientermine via GetRecurrencePattern) extrahiert
- es werden je Termin folgende Felder zum AppointmentItem extrahiert, nämlich: EntryId, Subject, Location, Start, End, AllDayEvent, Duration, ReminderMinutes, Categories, Importance, MeetingStatus, ResponseStatus, Sensitivity, LastModificationTime sowie bei Terminserien: Ausnahmen zu Serienterminen (Exceptions), StartSerie, AllDayEvent_Time, EndSerie, Type, Monat_Interval, Day_Instanz, DayOfWeekMask
- das Script erzeugt zwei Dateien: Eine Roh-Datendatei zur Weiterbearbeitung mit speziellen php-Scripten, sowie eine einfach aufgebaute Datei, in der z.B. alle Serientermine bereits tagesgenau ermittelt wurden (Vorjahr, aktuelles Jahr, nächstes Jahr), also eine recht universell verwendbare Terminliste
- weitergehende Dokumentation z.B. zur Definition der Serientermine und der Ausnahmen ist im Script selbst vorhanden
Features bei der Umsetzung des Datenextraktes aus Outlook mit dem php-Script
- liest die o.a. Roh-Datendatei ein und setzt diese um in das für meine Kalenderbibliotheken/-scripte verständliche Format
- Termine im Roh-Datenextrakt werden ignoriert, wenn sie bereits in einer anderen, vorhandenen Termindatei (z.B.: Feiertage im WikiKalender, die sowieso angezeigt werden) enthalten sind. Ggf. sollten diese Termine im WikiKalender aber mit einem Kennzeichen ->OL! im Notizenfeld versehen werden (s. Doku im Script selbst), damit man derartige Termine nicht verwechselt mit online über die Weboberfläche erfassten Terminen
- wurden online im Web neue Termine in die Termindatei erfasst, verbleiben diese so lange im Datenbestand, bis sie irgendwann mal auch in den Outlook-Roh-Daten auftauchen - oder manuell wieder gelöscht werden. Optisch kann man die Termine wie folgt unterscheiden: =manuell erfasster Termin ohne Entsprechung im Outlook, =aus Outlook übernommener Termin. Durch anklicken dieser Symbole im Monatskalender kann man übrigens derartige Termine schnell ins Outlook importieren (mittels dieser Funktionalität kann man unterwegs - bzw. wenn man mal keinen Zugriff auf den Rechner mit Outlook hat - Termine vorerfassen).
- die Kategorien Jahrestag, Jubiläum sollten im Outlook in die Hauptkategorienliste aufgenommen werden, oder man kann Jubiläen/Jahrestage durch einen * an 1.er Stelle des Termin-Subjects kennzeichnen. Das bewirkt, dass bei der Anzeige von so gekennzeichneten Terminen in Klammern jeweils die abgelaufene Jahreszahl (z.B. bei Geburtstagen das Alter) ausgegeben wird
- Wenn gewünscht Definition einer Kategorie / Sensitivity (z.B. Haken bei Privat) im Outlook, für eine spezifische Selektion der Outlook-Roh-Datensätze (d.h.: Es werden nur Datensätze übernommen, die mit einer ganz bestimmten Kategorie - oder die z.B. als privat gekennzeichnet sind). Dasselbe gilt für auszuschliessende Datensätze (über ein weiteres Kategorie- oder Sensitivity-Attribut) (Dadurch kann man ganz gezielt Termine von einer Webveröffentlichung ausschliessen - oder umgekehrt eben genau nur Termine ins Web stellen, die durch eine spezielle Kategorie (z.B. Webkalender) - gekennzeichnet sind!)
Beispiel zur vollständigen Automatisierung der Vorgänge
- Rechner auf dem Outlook und der Windows Scripting Host läuft (z.B. ein WinXP mit SP2)
- das VBScript auf dem Rechner mit lokalem Outlookprofil ablegen
- man besorgt sich z.B. WGET und WPUT für Windows (Wput is written by Hagen Fritsch, Wget setze ich mal als bekannt genug voraus)...
- man installiert die Kalenderbibliothek (und meinetwegen den Wiki auf einem Webserver)
- das phpScript an geeigneter Stelle auf dem Webserver ablegen
- über Geplante Tasks in Windows ruft man ein Batchfile in gewünschter Häufigkeit auf - alternativ startet man das Batchfile nur bei Bedarf (oder automatisch via Autostart-Ordner bei der Anmeldung in Windows oder beim beenden von Windows (geht im Gruppenrichtlinieneditor))
...das
Batchfile enthält z.B.:
(1) cscript vbs_outlook_terminliste.vbs
(2) c:/proginst/wput/wput -a wputlog.txt -u -B Outlook_Termin_Definitionen.csv
ftp://username:passwort@ftp.irgendeine-domain.de
(3) c:/proginst/wget/wget -b -r -a wgetlog.txt -t 1 -T 30 --dns-cache=off --cache=off
http://irgendeine-domain.de/somewhere/outlookkalender.php
(1) VBscript extrahiert aus den lokalen Outlookdaten den Inhalt des Ordners Kalender in eine CSVDatei
(2) WPUT transportiert die Datei mit FTP an passende Stelle auf dem Webserver - ich empfehle den UploadManager oder - besser vielleicht - ein hierfür speziell anzulegendes Incoming-Verzeichnis oder ein /tmp-Verzeichnis
(3) WGET triggert einfach nur das Script, dass die Daten auf dem Webserver passend umsetzt, man könnte auch einen cronjob o.ä. aufsetzen
Insbesondere für das WPUT bietet sich evtl. im Einzelfall eine sicherere Alternative an, bei der man z.B. eine verschlüsselte / gesicherte Verbindung nutzt und nicht das normale FTP-Protokoll...
Modifikationen an den bisherigen Kalenderbibliotheken
Tja, das Downloadarchiv oben ist kein \"einsatzbereites\" Paket! Wenn man schon einen lauffähigen Kalender (evtl. sogar mitsamt Wiki) von mir hat, sollte es reichen, die Dateien aus dem Archiv zu extrahieren und auf dem Webspace zu ersetzen (Anpassungen und Einstellungen nicht vergessen...) bzw. hinzuzufügen. Allen Anderen wünsche ich viel Spaß beim knobeln :->
- neue Images in /images der Kalenderbibliothek
- neue Felder an bestehende Termindateien anhängen (17: Notizen, 18: Last Modifification Date)
- neue feiertage.class.php (neue Datenfelder)
- neue kalender.csv.html (neue Datenfelder)
- neue functionscsvedit.php (neue Datenfelder setzen) des Wikis
- neue monatsblatt.php (Auswertung neuer Datenfelder)
- das phpScript vcalendar.php (download eines Termins im vCalendar-Format passend für Direkt-Import nach Outlook 2003)
- ...irgendwelche im Zweifel undokumentierten (sorry) Einzelheiten in den diversen Scriptfiles, die ich im Laufe der letzten Jahre geändert habe...
Um den Änderungsaufwand an alten Scripten zu minimieren, ist am alten CSV-Dateiformat wenig geändert, aber ich habe zwei neue Felder angehangen. Das erste - ein
Notizenfeld - davon nimmt Daten auf, die bisher so nicht vorgesehen waren (Kategorien, Angaben zu Sensitivity u.a. - siehe Scripte! - aus Outlook), das letzte Feld enthält jetzt das
Last Modification Date des Terminsatzes). Übrigens: Location, Uhrzeiten und ggf. der Besprechungsstatus von Outlook-Meetings landen einfach im Subject der Termine...
Neuentwicklungen
- das VBscript vbs_outlook_terminliste.vbs (extrahieren)
- das phpScript outlookkalender.php (umsetzen)
Tipps
- ältere KalenderDateien (CSVDateien), z.B. der WikiKalender müssen um neue Felder ergänzt werden. Am besten über den UploadManager downloaden, mit Excel die Überschriftszeile um neue Überschriften ergänzen, wieder als CSVDatei speichern, im UploadManager wieder hochladen (Feld17: notiz, Feld18: lastmdate)
- D.h. die komplette Feldliste besteht jetzt aus: Feiertag;Typ;anznr;vontag;vonmonat;vonjahr;bistag;bismonat;bisjahr;wiederholung;differenz;ausnahme;layout;frei;regional;nottage;quit;notizen;lastmoddate
- alle Termine des WikiKalender - die auch im Outlook schon definiert sind - sollten im WikiKalender im neuen Feld 17 (interne Notizen) durch ->OL! gekennzeichnet werden, ausserdem sollten die Subjects übereinstimmen, (nur) darüber erfolgt die Prüfung gegen ein anderes Kalenderfile und das autom. entfernen der Sätze aus den zu übernehmenden Outlook-Rohdaten. Eleganter ist es u.U. eine eigene Kategorie im Outlook zu definieren und alle diejenigen Termine zu kennzeichnen, die nicht übernommen werden sollen (diese Kategorie dann im php-Script eintragen bei exclude_category). Eine weitere Möglichkeit, wenn man eh schon alle Termine im Outlook hat: Im WikiKalender einfach die doppelten Termine weglöschen (aber dann funktionieren z.B. die Datumsberechnungen für Jubiläen ja nicht mehr...)
- Termine (bisher nur) im Webkalender durch anklicken des Symbols nach Outlook übernehmen (geht leider derzeit nur einzeln) - beim nächsten Abgleich sollten die dann mit etwas Glück automatisch gelöscht werden, sofern sie im Outlook richtig gelandet sind
- die vorliegenden Scripte befinden sich im Beta-Stadium und sind an der ein- oder anderen Stelle sicher noch nicht ''geschmeidig'' genug (und kommen evtl. auch nie darüber hinaus, klar sollte sein: Ich fühle mich nicht verpflichtet, irgendwelchen Support oder weitere Erklärungen zu liefern
ergänzende Infos
Aus der Microsoft Outlook (c) - Onlinehilfe entnommen: Ein
Outlook recurrence AppointmentItem (Serientermin) definiert sich über folgende Eigenschaften:
'===========================================================================
'RecurrenceTyp Eigenschaften Beispiel
'===========================================================================
'0 olRecursDaily Interval Alle N Tage
' DayOfWeekMask Jeden Dienstag, Mittwoch und Donnerstag
'
'2 olRecursMonthly Interval Alle N Monate
' DayOfMonth Der N-te Tag im Monat
'
'3 olRecursMonthNth Interval Alle N Monate
' Instance Der N-te Dienstag
' DayOfWeekMask Jeden Dienstag und Mittwoch
'
'1 olRecursWeekly Interval Alle N Wochen
' DayOfWeekMask Jeden Dienstag, Mittwoch und Donnerstag
'
'5 olRecursYearly DayOfMonth Der N-te Tag im Monat
' MonthOfYear Februar
'
'6 olRecursYearNth Instance Der N-te Dienstag
' DayOfWeekMask Dienstag, Mittwoch, Donnerstag
' MonthOfYear Februar
'===========================================================================
'Legende:
'Instance 1-4(5), 6=Letzter
'DayOfWeekMask Or 1=So, 2=Mo, 4=Di, 8=Mi, 16=Do, 32=Fr, 64=Sa
'DayOfMonth 1-31
'MonthOfYear 1-12
'NoEndDate true/false
'PatternStartDate Datum
'PatternEndDate Datum oder...
'Occurrences ...Anzahl von Wiederholungen
'===========================================================================
...setzt mein Script um in eine für die php-Scripte / Kalenderlib voradaptierte Form (weil sich jetzt die meisten fragen werden wo denn hier bitteschön die/eine Verbesserung gegenüber dem Outlook-Datenmodell vorliegt)...
'Minidoku
'Subject Betreff
'Location Ort
'Start Beginndatum und ggf. (nicht immer!) Uhrzeit tt.mm.jjjj hh:mm - betrifft auch alle anderen DatFelder
'End Endedatum und ggf. Uhrzeit - der 31.12.4500 23:59:00 scheint das \"Highdate\" zu sein (=ohne Ende)
'AllDayEvent AllDayEvent (ganztägig) oder leer
'Duration Dauer in Minuten
'ReminderMinutes Erinnern x Minuten vor dem Termin
'Categories Kategorien, getrennt durch Komma(!)
'Importance Wichtigkeit/Prio, sofern abweichend von Normal
'MeetingStatus Status des Meetings
'ResponseStatus Antworten auf Meeting-Anfrage
'Sensitivity Vertraulichkeit (z.B. \"Privat\"-Schalter)
'LastModificationTime zuletzt geändert am...
'Serie S, wenn Serientermin, genau wie alle folgenden Felder nur für Terminserien relevant seind:
'Ausnahmen zu/von einer Serie (gelöscht oder geändert) nach folgendem Schema:
'Trenn1 ^ trennt einzelne Ausnahmeregeln einer Serie
'Trenn2 ° trennt die Felder einer Ausnahme
'isDeleted°21.12.2006^... an diesem Tag findet die Terminserie nicht statt
'isModified°Datum°Start°End°Duration°AllDayEvent°Subject°Location^ ... an diesem Tag ist etwas anders
'StartSerie Startdatum der Terminserie
'AllDayEvent_Time AllDayEvent oder Startzeit
'EndSerie Endedatum der Terminserie
'Type Typ der Wiederholung: DAILY PERIOD WEEKLY MONTHLY MONTHLYnTH YEARLY YEARLYnTH
'Monat_Interval Monat oder Intervall - Tage Interval Interval Interval Monat Monat
'Day_Instanz Tag oder Instanznummer - - - Tag 1-4/L (Wo) Tag 1-4/L (Wo)
'DayOfWeekMask Maske betroffener Wochentage - - Maske - Maske - Maske
'Interval: Gibt das regelmäßige Intervall an, z.B. bei Wochenterminen ist 1=jede Woche, 2=alle zwei Wochen...
'1-4/L (Wo): Gibt bezogen auf den Wochentag die n.te Woche im Monat an (L=letzte)
'Maske: Siebenstelliges Feld (Montag-Sonntag), \"MDMDF--\" z.B. wäre Montags-Freitags, \"---D---\" wäre Donnerstags...
'isModified: Beachten, dass auch andere Felder geändert sein könnten (z.B. Meeting..., Categories...)
...diverse weitere Infos finden sich im
Quelltext der Scripte, die im übrigen natürlich
vor erstem Einsatz angepasst werden müssen (Pfade, Dateinamen etc.).
Wie man sieht, habe ich beim Entwurf nicht ''aufs Bit geschaut'' - natürlich kann man da einiges optimieren (ist bei einer geringen Anzahl an Terminen aber nicht wirklich relevant)...
13.12.2020 ↸