download
VBA Makro (Visual Basic for Applications) für Outlook 2003 zum extrahieren (speichern Anhänge als Datei) von Anhängen eines MailItem ins Filesystem (Laufwerk Pfad Dateiname). Die Anhänge werden anschliessend im Outlook (Exchange) in der Mail gelöscht - in einem neuen Anhang zur Mail wird aber ein (anklickbarer) Verweis mit dem Dateinamen hinterlegt - der Body (als Nur-Text) und die wesentlichen Header werden ebenfalls dokumentiert
Installation
- in Outlook 2003 Alt+F11 (VBA Editor)
- Textdownload (Sub... End Sub) z.B. in Modul1 kopieren (ggf. Doppelklick links auf Name, rechts reinkopieren)
- den Pfadnamen anpassen (und was sonst nicht gefällt, suche hierzu alle Kommentarzeilen mit "§§§" im Source) und speichern
- Makro am besten in eine Symbolleiste plazieren (sonst jeweils Alt+F8)
Den Pfadnamen sucht man im Makro nach folgender Zeile:
'Hier wird im Dialog nach dem Ort gefragt wo gespeichert werden soll - muss schon existieren
Wenn man diesen Pfad ohnehin nie ändert, ersetze man die ganze Folgezeile durch eine simple
Zuweisung anstelle jedesmal eine Dialogbox aufpoppen zu lassen, z.B.:
myOrt = "d:/user/juergen/Archive/Outlook/Anlagen/"
Anwendung
- Mails mit/ohne Anhänge markieren
- Makro in Symbolleiste anklicken (bzw. via Alt+F8 starten wenn man Symbolleiste nicht angepasst hat)
- Sicherheitsmeldungen bestätigen (je nach Anzahl Mails 1 Minute oder mehr erlauben)
Arbeitsweise
- bearbeitet alle in Outlook markierten Mails (die Anlagen enthalten)
- Anlagen werden ins Filesystem extrahiert und in Outlook gelöscht
- es wird eine neue Anlage(!) zur Mail ergänzt. Diese enthält (einfaches HTML-Dokument) die wichtigsten Infos zur Mail (From, To, Cc, Subject, Größe gesamt, gesendet/empfangen, Body als Nur-Text) sowie anklickbare Links zu den extrahierten Anlagen
Zumindest für Nur-Text-Mails könnte man die Hinweise zu extrahierten Anlagen auch einfach im Body der Ursprungsmail hinterlegen (einfach myItem.Body ergänzen). Für HTML/RichText-Mails ist mir das nicht gelungen (die Felder lassen sich zwar ändern, aber die Msg konnte nicht mehr gespeichert werden (als zur Nur-Text-Mail umgewandelte Nachricht schon). Liegt an der "weak Object Reference" für myItem vermute ich. Wahrscheinlich wäre nur eine Kleinigkeit zu ändern gewesen - jetzt ist es mittels externer Anlage gelöst...
Wen die Sicherheitsabfrage des Makros nervt
- Man kann seine eigenen VBA Makros signieren. Dazu muss man zunächst ein passendes Zertifikat haben (oder lokal selbst erzeugen) und damit in der VBA-Entwicklungsumgebung das Makro signieren. Nach jeder Änderung am Source ggf. wieder neu... Auf anderen Rechnern muss man die ganze Prozedur ebenfalls wiederholen...
- bessere Lösung: Als Add-In programmieren, z.B. in C++ - da gibts dann keine Sicherheitsabfragen mehr (warum auch immer)
Hinweise
- normalerweise werden die Anhänge mit ihrem Originalnamen (Mini-Prüfung auf "schädliche" Zeichen anhand Blacklist) und einem Datumspräfix (Entstehungs-Timestamp der Mail) im Verzeichnis myOrt abgelegt: ''laufwerk:/pfad/''jjjjmmtt_hhmmss-orginalname.endung
- u.U. legt man eher je Jahr ein eigenes Verzeichnis an (oder je Sender oder je Anlagentyp (Dateiendung) oder...)
- evtl. filtert man auch via Anlagengröße (kleine Anlagen bleiben im Mailstorage, nur große Files werden extrahiert)...
- Probleme gibts bei HTML-Mails (eingebundene aber jetzt extrahierte Bilder werden anschliessend nicht mehr dargestellt!)
- am Anfang des Makros steht noch ungefähr drin, wie man es als Script für die Outlook Regeln einsetzen kann (Extras - Regeln und Benachrichtigungen). Da nervt dann aber die Sicherheitsabfrage (d.h. man müsste signieren) - und ich habe es auch nur als Nur-Client-Regel hinbekommen (was im Normalfall ausreichen sollte)...
- natürlich ist das Verzeichnis mit den Dateien genausogut zu sichern wie der Mailstorage (und umgekehrt)...
14.10.2008 ↸
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 ↸