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 …

10 Antworten auf “AppleScript: Mail-Nachrichten als Datei wegspeichern”

  1. Mailkontakt mit spr-IT:

    ———————-
    spr-IT:
    Hallo,

    Meine Anmerkungen zu den Fragen setze ich unten zwischen den Text … Danke fürs Interesse an meiner Idee!

    Übrigens – wenn solche Fragen nicht per E-Mail, sondern als Kommentar auf meinen Seiten gestellt werden, hat auch der nächste Leser was davon 😉

    Gruß spr-IT
    ———————-

    FRAGE:
    Vielen Dank für das Script.

    Ich würde gerne auf den Verteiler für die neuste Version gesetzt werden.

    ANTWORT:
    Einen „Verteiler“ gibt es nicht 😉
    Das Skript dient als Anregung, selbst kreativ zu werden.

    FRAGE:
    Ist es auch möglich, die E-Mail Adresse in den Filename einzufügen?

    z.B.
    „xxxx@xxxx.de ___2019-01-27___15.12.39 – Betreff.eml“

    ANTWORT:
    Klar, aber – macht das Sinn? Gerade bei Mails an mehrere Empfänger wird das problematisch (welche Adresse soll herangezogen werden?). Außerdem wird der Dateiname ziemlich lang, was in Unterverzeichnisstrukturen bei der Ablage dann zu Problemen führen kann.
    Ich empfehle stattdessen, mit Unterverzeichnissen für die wichtigsten regelmäßigen Partner zu arbeiten und die Dateinamen eher kürzer zu halten. So mache ich es selbst und bei Kunden seit Jahren zur vollsten Zufriedenheit…

    FRAGE:
    Und es wäre super, wenn ich unterscheiden könnte, ob ich die Mail gesendet oder bekommen habe.

    „xxxx@xxxx.de ___2019-01-27___15.12.39___von__ – Betreff.eml“
    „xxxx@xxxx.de ___2019-01-27___15.12.45___an___ – Betreff.eml“

    Obwohl ich dann ja auch einfach zwei Scripte nehmen kann. 😉

    ANTWORT:
    Auch möglich, aber gleiches Thema wie oben (Länge des Dateinamens / Pfades). Ist das Konzept des „intelligenten Postfaches“ in Apple Mail bekannt? Dies in Verbindung mit einer Ordnerstruktur im Dateisystem erscheint mir persönlich am sinnvollsten.

    ————————–

    Vielen Dank

    Mit freundlichen Grüßen

    Frank

    Liken

  2. Vielen Dank für die schnelle Antwort.

    Ich würde gerne immer die erste „VON“ bzw. „AN“. Email Adresse im Dateinnamen haben 😉

    So ist es möglich viele Mails auf einmal zu sichern. Wahrscheinlich werde ich sie nie mehr anfassen müssen.
    Bei bedarf kann ich einfach alle Dateien sortieren.

    Ich habe schon gesucht aber nichts richtiges gefunden an die Email Adressen zu kommen. Dafür habe ich leider nicht genug Ahnung.

    So wie das Script ist, kann ich aber schon etwas damit anfangen.

    Liebe Grüße

    Frank

    Liken

  3. Eine „VON“-Adresse sollte in einer Mailnachricht nur eine einzige vorhanden sein, das ginge also. Aber die „AN“-Adressen werden oft auch einfach alphabetisch sortiert zurückgegeben, da wäre es also wohl oft nicht die wirklich gewünschte …

    Liken

  4. Eine Frage hab ich noch.

    Mit welchen Programm kann ich am besten den Inhalt von .eml Dateien durchsuchen?

    Oder muss ich, wenn ich etwas suche, die Dateien wieder in Mail-App kopieren? Das wäre aber aufwendig.

    Viele Grüße

    Frank

    Liken

  5. Hallo Frank, jetzt sind wir bei einem der großen Vorteile von macOS – hier funktioniert die Voransicht per Leertaste, das Öffnen per Doppelklick und natürlich auch die indizierte Suche per Spotlight :-))
    VG, St.

    Liken

  6. Ich würde gerne meine Mails nicht als *.eml sondern als *.emlx exportieren können.

    PS.
    Ich bezutze das Programm Hazel der Firma noodlesoft um meine Prozesse zu automatisieren.

    Es währe Super wenn es ein abgespecktes Script geben würde, ohne die vielen Hiweis-Popuss und auswahlmöglichktieten.

    Ich stelle mir den Arbeitsablauf wie folgt vor:

    1. Mails auswählen die exprotiert werden sollen.
    2. Script ausführen.
    3. Meldung das xx Mail in den Ordner xxx gespreichert wurden. Diese Meldung mit OK bestätigen.

    ps. alles Andere würde dann Hazel für mich machen.

    Liken

    1. Hallo Niels (mit „ie“?),

      Das auf der Webseite gezeigte Skript ist derzeit noch im Wesentlichen aktuell … die einzigen Anpassungen, die aber ohnehin jeder für sich selber treffen muss, beschreiben die gewünschte Dateinamenskonvention / Definition der Trennzeichen.

      Den tieferen Sinn, auf das m.E. veraltete *.emlx-Format zu setzen, verstehe ich nicht. *.eml ist mittlerweile ein systemübergreifender Standard, welcher auch Dateianhänge mitnimmt (was ich für ziemlich wichtig halte!). *.emlx ist in der Urform lediglich ein Textformat für den Emailinhalt, speichert dann aber eben keine Anhänge. Macht das also wirklich Sinn?

      Die Dialoge kann man natürlich ganz einfach auskommentieren, wenn nicht benötigt. Nachteil: man sieht nicht, ob/dass das Skript auch läuft.

      In den Kommentaren hast Du auf eine Software hingewiesen, die ich noch nicht kenne (noodlesoft „Hazel“). Da würden mich die Praxiserfahrungen bzw. das Anwendungsszenario mal interessieren … wo kommt es denn vor, dass Hunderte ähnlicher Dateien anfallen und automatisiert verschoben werden müssen? Ich kenne das nur vom Import digitaler Fotografien, aber da ist ohnehin manuelle Sichtung erforderlich …

      Liken

      1. Hallo spr-IT danke für deine schnelle Antwort auf meine Fragen. Und Sie lesen richtig, mein Vorname wird mit „ie“ geschrieben 🙂

        Meine ursprüngliche Idee war:

        1. Emails aus Apple Mail, per drag and drop, auf den Desktop fallen lassen.
        2. Hazel schiebt die *.eml Datei automatisch in ein von mir definiertes Verzeichnis.
        3. Hazel nennt die ursprüngliche Datei z.B. „Autokauf.eml“ in mueller@bmw.de 2019-05-01 um 12.30 Uhr — Autokauf.eml um (die hierfür erforderlichen Daten soll Hazel aus dem Inhalt der Mail auslesen und für das Umbenennen verwenden).

        (Name des Absenders) (Datum und Urzeit wan die Email versendet wurde) (Text im Betreff der Email)

        Wenn ich Dateien im Format *.emlx bereitstelle kann Hazel die von mir benötigten Informationen aus der Email auslesen und die entsprechende emlx Datei entsprechend umbenennen. Bei *.eml funktioniert das leider nicht.

        Ich dachte das Dateiformat *.eml wäre das Ältere Dateiformat und *.emlx das neuere, wie bei Word von Microsoft.

        PS.

        Hazel benutze ich um Dateien im Format (pdf, mp3, avi etc.) automatisch umzubenennen und in entsprechende Unterverzeichnisse zu verschieben. Die relevanten Dateiinformationen liest Hazel aus den oben genannten Dateien aus und verwendet diese dann z.B. um die Dateien umzubenennen oder Ordner entsprechend zu betiteln.

        Ich lasse meinen Desktopinhalt von Hazel überwachen und sage dem Programm, dass es z.B. alle PDF-Dateien die den Textinhalt „Telecom, Rechnung vom **.**.****“ enthalten und länger als 7 Tage auf dem Desktop liegen, in einen bestimmten Ordner meiner Festplatte verschiebt und anschließend die Datei umbenennt. Auch lassen sich automatisch Tags zuordnen etc.

        Leider gibt es das Programm nur auf English.

        Liken

  7. Wie kann ich stattdessen PDF stammen EML realisieren? Hier klingt es so einfach, aber der einzige Weg, den ich bislang gefunden habe, ist über GUI-Scripting, was nicht wirklich zu gebrauchen ist. Wäre für einen Tipp sehr dankbar!

    Liken

Schreibe eine Antwort zu spr-IT Antwort abbrechen

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 )

Verbinde mit %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.