AppleScript: Mail-Nachrichten als Datei wegspeichern

Wer viele eMails bekommt, kennt das Problem – der Posteingang wird voll, und es wird nötig, Nachrichten in Unterverzeichnisse oder Archive zu verschieben. Aber auch diese Archive und Unterverzeichnisse laufen irgendwann voll, und der Mailspeicherplatz gerade bei IMAP-Anbietern ist auch endlich.

Was liegt also näher, als Nachrichten gleich ins Filesystem (also: auf ein Laufwerk der Wahl) als Datei zu exportieren?

Das ist leider nicht ganz so einfach, denn Apple Mail bietet dafür erstmal keine Exportfunktion. Zwar kann man einzelne Dateien per Drag & Drop in den Finder ziehen, aber das ist für viele Dateien und systematische Ablage keine Option.

Also kommt AppleScript ins Spiel.

Ich habe das nachfolgende Skript natürlich nicht komplett selbst erfunden, sondern mich vorher im Web umgeschaut, ob es schon geeignete Ansätze gibt – zwei davon habe ich verwertet und ergänzt. Grundsätzlich wäre es möglich, jede Nachricht als PDF-Datei abzulegen – dem Vorteil der relativen Dokumentensicherheit steht der Nachteil gegenüber, dass eine solche Nachricht nicht einfach im Bedarfsfalle mit MAIL geöffnet und zitiert / weiterbearbeitet werden kann. Daher habe ich auf das EML-Format gesetzt.

Hier erstmal mein Skript im aktuellen Stand: siehe Kommentar unten …

-- Script aus http://www.mactechnews.de/forum/discussion/Freche-Frage-AppleScript-das-alle-ausgewaehlten-Mails-einzeln-als-reine-Datei-in-einen-Ordner-speichert-313262.html

-- geändert:
-- a. Jahreszahl jetzt vierstellig, Trennstriche im Datum, Uhrzeit als hh_mm ergänzt
-- b. set FlagIndex to 3 (green)
-- c. Dialogbox für Anzahl bearbeiteter Nachrichten sowie Zielordner eingebaut
-- d. Filtern von "", Ersetzung durch _
-- e. Funktionales Hauptteil gelöscht und durch die Quelle von http://www.rajsingh.org/tools/exportemails.html ersetzt
-- f. Ersatzungstabelle Sonderzeichen modifiziert, damit auch ownCloud sauber syncen kann
-- g. Option, Zielordner im Finder zu öffnen
-- h. display dialog ergänzt um "giving up after ..."
-- i. default buttons gesetzt

-- © StefanSK, Änderungsstand 2017-07-29

tell application "Mail"

set verStand to "2017-07-29 "

set msgs to selection

if length of msgs is not 0 then

display dialog "Sollen die markierten Nachrichten exportiert und anschließend mit einem bunten Fähnchen gekennzeichnet werden?" default button 1 with title "© StefanSK / " & verStand with icon caution buttons {"Abbruch", "Exportieren!"} giving up after 30

if the button returned of the result is "Exportieren!" then

-- set up month parsing value for French Vanilla algorithm

set fixedDate to current date --or any other date

set month of fixedDate to January

-- set theFolder

set theFolder to choose folder with prompt "Exportierte Nachrichten speichern nach ..." without invisibles

repeat with msg in msgs

-- -- create new name prefix based on date

set msgDate to date received of msg

-- parse date

set theYear to year of msgDate

set theMonth to month of msgDate as integer

set theMonth to my addZero(theMonth as string)

set theDay to my addZero(day of msgDate as rich text)

set hrs to my addZero(hours of msgDate as rich text)

set mins to my addZero(minutes of msgDate as rich text)

set secs to my addZero(seconds of msgDate as rich text)

set msgDate to theYear & "-" & theMonth & "-" & theDay & "_" & hrs & "." & mins & "." & secs

-- strip out funny characters that we don't want in a file name

--set comparison_string to ":/[]"

--set replacement_string to "->||"

set comparison_string to "||*:/[]<>?\""

set replacement_string to "--x_-()()_'"

set msgSubject to ""

repeat with c in (subject of msg as string)

set x to the offset of c in comparison_string

if x is not 0 then

set msgSubject to (msgSubject & character x of replacement_string) as string

else

set msgSubject to (msgSubject & c) as string

end if

end repeat

set msgSubject to my replaceText("Re- ", "", msgSubject)

set msgSubject to my replaceText("Re-", "", msgSubject)

set newFileName to (msgDate & "_" & msgSubject & ".eml") as Unicode text

try

set fn to (theFolder as Unicode text) & newFileName

--set fn to "tmp:xxxxxxx.emlx"

--display dialog ("file name is: " & fn)

set fnid to open for access fn with write permission

write (get source of msg) to fnid

--save msg in fn -- as native format

close access fnid

on error errorMessage number errorNumber

display dialog errorMessage & " Error #" & errorNumber as rich text buttons {"Oops"}

end try

-- set AnzMessages to AnzMessages + 1

set flag index of msg to 3

end repeat

-- ends processing of messages

--display dialog "Es wurden " & AnzMessages & " / " & length of msgs & " eMails  in das Verzeichnis 

display dialog "Es wurden " & length of msgs & " eMails  in das Verzeichnis 

" & theFolder & "

gespeichert und mit einem Flag markiert.

Die markierten Dateien können jetzt aus Apple Mail gelöscht werden, falls erforderlich!" with title "© StefanSK / " & verStand default button 2 with icon caution buttons {"Super, Danke!", "Zeig mir den Zielordner!"} giving up after 5

set DialogErgebnis to result

if button returned of result = "Zeig mir den Zielordner!" then

tell application "Finder"

activate

open folder theFolder

end tell

end if

end if -- OK to export msgs

end if -- msgs > 0

end tell

on addZero(v)

if length of v < 2 then

return "0" & v

end if

return v

end addZero

on replaceText(find, replace, subject)

set prevTIDs to text item delimiters of AppleScript

set text item delimiters of AppleScript to find

set subject to text items of subject

set text item delimiters of AppleScript to replace

set subject to "" & subject

set text item delimiters of AppleScript to prevTIDs

return subject

end replaceText

Dieses Skript wird je nach Bedarf weiterentwickelt …

Was tut das Skript?

Es nutzt die im aktuellen Mailfenster markierten Nachrichten, speichert diese einzeln als *.EML-Datei in ein frei wählbares Verzeichnis und markiert sie abschließend in AppleMail mit einem grünen Fähnchen (damit klar ist, dass diese Nachrichten jetzt z.B. gelöscht werden können). Der Name der jeweiligen Datei besteht aus einem Präfix sowie anhängend dem Betreff der Mailnachricht (Datum und Uhrzeit – „2017-09-11_21.32.55_Betreff…“). Somit ist bei konsequenter Verwendung ein Sortieren im Finder sehr leicht möglich.

Wie kommt es auf den Rechner?

Das ist ein allerdings wenig tricky 🙂

  1. Zunächst bitte die Applikation „Automator“ starten.
  2. Dort dann wie im Bild gezeigt unter „Ablage“ – „neu“ einen neuen „Dienst“ erzeugen.
    Bildschirmfoto 2017-09-13 um 19.48.22
  3. Sodann in der linken Spalte auf „AppleScript ausführen“ drücken und diesen Eintrag ins rechte Fenster ziehen – es öffnet sich ein fast leeres Skript-Template.
    Bildschirmfoto 2017-09-13 um 19.50.58
  4. In diesem Skript-Template kann dann der bisherige Inhalt gelöscht und durch mein obiges – per Copy in die Zwischenablage genommenes – Skript ersetzt werden.Außerdem bitte den Inhalt der Felder „Dienst empfängt ausgewählten TEXT in JEDEM PROGRAMM“ auf „Dienst empfängt KEINE EINGABE in MAIL.APP“ ändern. Bildschirmfoto 2017-09-13 um 19.46.43
  5. Ist das Skript einkopiert, bitte einmal auf den Play-Button drücken (das Dreieck unterhalb von „AppleScript ausführen“). Die Darstellung des Textes im Fenster ändert sich – Schlüsselworte werden markiert!Bildschirmfoto 2017-09-13 um 19.54.49Fast fertig.
  6. Unter „Ablage“ – „sichern“ wird das Skript mit einem passenden Namen versehen und mit der Erweiterung .WORKFLOW abgespeichert.
  7. Nach Beenden des Automators kann im Finder per Doppelklick auf die *.WORKFLOW-Datei ein Dialog aufgerufen werden, der das soeben erzeugte Skript als Dienst hinzufügt. VORSICHT – dieses „Installieren als Dienst“ verschiebt die Datei ins geschützte Verzeichnis „services“, was bedeutet, dass man sich vorher besser eine Kopie macht und woanders hinlegt … 

Super. Jetzt kann in den Systemeinstellungen noch angepasst werden, ob dieser neue Dienst auch per Tastenkürzel aufrufbar sein soll …

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden /  Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden /  Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden /  Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden /  Ändern )

w

Verbinde mit %s