AHK – Speichern von eMails aus Outlook im Explorer mit Zeitstempel

Aus unterschiedlichsten Gründen kann es erforderlich werden, eine bestimmte Menge eMails im Explorer oder auf einem Netzlaufwerk abzulegen. Das ist mit Outlook generell auch recht einfach per Drag & Drop realisierbar, birgt aber einige Probleme. Das größte Problem: Die Mails bekommen im Explorer alle das heutige Datum und nicht das Sende- / Empfangsdatum gesetzt. Und bei Mailketten wird einfach nur eine laufende Nummer am Dateinamen angehangen. Eine chronologische Sortierung ist somit vollständig ausgeschlossen. Erschwerend kommt auch noch hinzu, dass Outlook beim kopieren nicht prüft, ob die max. zulässige Zeichenzahl von 255 für Pfad + Dateiname überschritten wird. Es kann beim einfachen Kopieren also auch zu Abbruchfehlern führen.

Im Internet gibt es haufenweise Makros und AddIns für Outlook, mit denen sich die Mails recht komfortabel mit beliebigen Informationen im Dateinamen speichern lassen (u.a. Zeitstempel). Allerdings ist die Ausführung von Makros in Outlook auf den betreffenden PCs gesperrt.

Zum Glück stehen aber andere Hilfmittel zur Verfügung. Eines davon ist AutoHotKey (AHK).

Das beigefügte AHK-Script speichert beliebig viele eMails mit Zeitstempel in einem frei wählbaren Verzeichnis innerhalb des eigenen Benutzerprofils. Dazu müssen die gewünschten eMails in Outlook markiert werden, anschließend drückt man F9. Daraufhin öffnet sich ein Eingabedialog, in welchem man das Zielverzeichnis auswählen und bei Bedarf auch neue Ordner anlegen kann. eMails mit gleichem Betreff und auf die Sekunde identischem Zeitstempel werden nur einmal abgelegt. Zu lange Betreffzeilen werden eingekürzt, so dass der Zielpfad + Zeitstempel und Mailbetreff in Summe eine Länge von 255 Zeichen nicht überschreiten.

Um das AHK-Script zu starten, muss zunächst natürlich AHK installiert sein. Danach genügt ein Doppelklick auf die Datei, um sie in AHK zu laden.

Soll das AHK-Script bei jedem Systemstart automatisch geladen werden, muss eine Verknüpfung zum AHK-Script im Autostart-Ordner gespeichert werden. Diesen erreicht man sehr schnell, indem man gleichzeitig auf die Tasten [Windows] und [R] drückt. Es öffnet sich der Ausführen-Dialog. Hier gibt man nun den Befehl shell:startup ein und bestätigt mit OK. Anschließend öffnet sich der Autostart-Ordner.

Outlook muss in der deutschen Sprachversion genutzt werden, andernfalls sind Anpassungen in den Zeilen 31-36 erforderlich.

; Das nachfolgende Script basiert auf den folgenden Projekten
; https://www.autohotkey.com/boards/viewtopic.php?t=12682
; https://www.autohotkey.com/boards/viewtopic.php?t=47969
; es wid gestartet, wenn im Hauptfenster von Outlook die Taste F9 gedrückt wird

#NoEnv ; Recommended for performance and compatibility with future AutoHotkey releases.
EnvGet, A_UserProfile, UserProfile ; UserProfile-Directory as variable

#IfWinActive, ahk_exe OUTLOOK.EXE
F9::

; Auswahl des Verzeichnis, in welches die Mails gespeichert werden sollen
FileSelectFolder, FileFolder, %A_UserProfile%, 1, Bitte Verzeichnis zum Speichern der Mails auswaehlen
if ErrorLevel
	return

olApp := ComObjActive("Outlook.Application")
Window := olApp.ActiveWindow 
if (Window.Class = 34) {  ; 34 = Prüfen, ob das Outlook-Hauptfenster geöffnet ist
    Selection := Window.Selection
    if (Selection.Count > 0) {
        Loop, % Selection.Count {
            Item := Selection.Item(A_Index)
			
            ; Zeichen entfernen, welche im Dateinamen nicht zulässig sind: \ / : * ? | " < >
            FileName := RegExReplace(Item.Subject, "[\?<>/\\\*""|:]")
			
			; Datum der Mail einlesen, zerlegen und für die Ausgabe neu zusammensetzen
			; setzt deutsches Datumsformat DD.MM.YYYY hh:mm:ss voraus
			olReceivedTime := Item.ReceivedTime
			date_d := SubStr(olReceivedTime, 1, 2)
			date_m := SubStr(olReceivedTime, 4, 2)
			date_y := SubStr(olReceivedTime, 7, 4)
			date_h := SubStr(olReceivedTime, 12, 2)
			date_min := SubStr(olReceivedTime, 15, 2)
			date_s := SubStr(olReceivedTime, 18, 2)
			olTime := date_y "-" date_m "-" date_d " " date_h "." date_min "." date_s
            
			; Speicherpfad und Dateinamen zusammensetzen
			FileDir := FileFolder "\" olTime " - " FileName ".msg"

			FileDirLen := StrLen(FileDir)
			FileDirMinLen := StrLen(FileFolder "\" olTime " - " ".msg")
			
			; Prüfen, ob die Verzeichnisnamen bereits zu lang sind, so dass selbst das Minimum an Dateinamen nicht mehr gespeichert werden könnte
			if (FileDirMinLen >= 255) {
				MsgBox, Mails koennen nicht gespeichert werden, da die maximal zulaessige Zeichenzahl von 255 Zeichen fuer Pfad + Dateiname ueberschritten wird
				return
			}

			; Prüfen, ob der Pfad + Dateiname insgesamt länger als 255 Zeichen wird. Trifft dies zu, wird der Mail-Betreff passend eingekürzt
			if (FileDirLen > 255) {
				FileNameLen := StrLen(FileName)
				FileNameSub := FileNameLen - (FileDirLen - 256)
				FileName := SubStr(FileName, 1, FileNameSub)
				FileDir := FileFolder "\" olTime " - " FileName ".msg"
			}
			
			; Mail nur speichern, wenn noch keine gleichname Datei mit exakt identischen Zeitstempel vorhanden ist
			if !FileExist(FileDir) {
				Item.SaveAs(FileDir, 3)
			}

			; Alternativ alle Mails speichern und doppelte mit laufender Nummer ablegen
			; kann bei erneutem Durchlauf zu Fehlern führen
;			if FileExist(FileDir) {
;                Loop, {
;                    FileDir := FileFolder olTime " - " FileName "(" (A_Index + 1) ").msg"
;                    if !FileExist(CorrectedPath)
;                        break
;                }
;			}
;			Item.SaveAs(FileDir, 3)
        }
    }
}
return
#If
Dieser Beitrag wurde unter Coding abgelegt und mit , verschlagwortet. Setze ein Lesezeichen auf den Permalink.