Apple Mail: EMLX-Datei der ausgewählte Nachricht speichern

Apple Mail nutzt glaube ich seit Leopard nicht mehr eine fette mbox Datei sondern einzelne .emlx Dateien zum speichern der abgerufenen Emails. So können die Dateien schön einzeln indiziert (Spotlight) werden und können auch recht leicht kopiert werden (TimeMachine). Eine solche EMLX-Datei lässt sich über Quicklook oder Apple Mail betrachten und beinhaltet sogar die in der Email enthaltenen Anhänge.Dummerweise kann man via AppleScript nicht direkt den Speicherort der Email abfragen, aber da die emlx-Datei nach der ID der Email benannt ist, kann man sie recht leicht im entsprechenden Account-Ordner finden.
Das tut dieses Skript also, es sucht sich die emlx-Dateien der ausgewählten Emails kopiert diese auf den Schreibtisch…
Ein Grund für den regen Gebrauch von Wildcards im find-Befehl ist die Tatsache, dass besonder große Emails aufgesplittet werden in .emlx und .emlxpart Dateien. Gemeinsamer Nenner ist aber immer die ID, mit der der Dateiname stets beginnt.

--hubionmac.com 29.12.2010 EMLX-Dateien ausgewählter Emails in einen Order (Saved_Mails(Acountname) auf dem Schreibtisch kopieren... (4 Chris_Zuerich) 
-- hubionmac.com 17.03.2012 Nun bereiten wohl auch lokale Email-Ordner dem Skript kein Kopfzerbrechen mehr 
--auswahl aus Apple Mail abfragen 
set mymails to my getSelection() 
repeat with mymail in mymails 
   tell application "Mail" 
      --das Verzeichnis des Email Accounts ausfindig machen 
      try 
         set accountDir to quoted form of POSIX path of ((account directory of account of mailbox of mymail) as alias) 
      on error --ist wohl ein lokaler Mail-Ordner 
         set accountDir to "~/Library/Mail/" 
      end try 
      try 
         set account_name to (name of account of mailbox of mymail) as rich text 
      on error --ist wohl ein lokaler Mail-Ordner 
         set account_name to address of to recipient 1 of mymail 
         repeat with a in every account 
            if email addresses of a contains account_name then 
               set account_name to name of a 
               exit repeat 
            end if 
         end repeat 
      end try 
      tell application "Finder" to set temp_dir to quoted form of (POSIX path of (desktop as alias) & "Saved_Mails (" & account_name & ")/") 
      try 
         do shell script "mkdir " & temp_dir 
      end try 
      --in dem Account-Verzeichnis nach der der Email-Datei suchen und diese kopieren... 
      set myid to id of mymail 
      do shell script "find " & accountDir & " -name " & myid & "*.emlx* -exec cp {} " & temp_dir & " \\;" 
   end tell 
end repeat 

on getSelection() 
   tell application "Mail" 
      set a to selection 
      if (count of a) < 1 then 
         error "Eine Mitteilung muss ausgewählt sein." 
      end if 
      return a 
   end tell 
end getSelection
									

28.11.2012/13.05.2013: Leicht angepasste Version, die das Empfangsdatum und den Betreff mit in den Dateinamen der emlx-Datei schreibt:

--hubionmac.com 13.05.2013 kleiner BugFix... hatte vergessen temp_dir zu quoten ;-)
--hubionmac.com 29.12.2010 EMLX-Dateien ausgewählter Emails in einen Order (Saved_Mails(Acountname) auf dem Schreibtisch kopieren... (4 Chris_Zuerich) 
-- hubionmac.com 17.03.2012 Nun bereiten wohl auch lokale Email-Ordner dem Skript kein Kopfzerbrechen mehr 
--auswahl aus Apple Mail abfragen 
set mymails to my getSelection()
repeat with mymail in mymails
  tell application "Mail"
    set thesubject to subject of mymail
    set thesubject to my replace_chars(thesubject, "/", "-")
    set thesubject to my replace_chars(thesubject, ":", "-")
    set thedate to date received of mymail
    set thedate to (year of thedate) & "-" & (month of thedate as integer) & "-" & (day of thedate) as rich text
    --das Verzeichnis des Email Accounts ausfindig machen 
    try
      set accountDir to quoted form of POSIX path of ((account directory of account of mailbox of mymail) as alias)
    on error --ist wohl ein lokaler Mail-Ordner 
      set accountDir to "~/Library/Mail/"
    end try
    try
      set account_name to (name of account of mailbox of mymail) as rich text
    on error --ist wohl ein lokaler Mail-Ordner 
      set account_name to address of to recipient 1 of mymail
      repeat with a in every account
        if email addresses of a contains account_name then
          set account_name to name of a
          exit repeat
        end if
      end repeat
    end try
    tell application "Finder" to set temp_dir to (POSIX path of (desktop as alias) & "Saved_Mails (" & account_name & ")/.tmp/")
    try
      do shell script "mkdir -p " & quoted form of temp_dir
    end try
    --in dem Account-Verzeichnis nach der der Email-Datei suchen und diese kopieren... 
    set myid to id of mymail
    do shell script "find " & accountDir & " -name " & myid & "*.emlx* -exec cp {} " & quoted form of temp_dir & " \\;"
  end tell
  tell application "Finder"
    set thefiles to every item of (((temp_dir as POSIX file) as string) as alias)
    repeat with thefile in thefiles
      set name of thefile to (thedate & " - " & thesubject & " " & (name of thefile) as string)
    end repeat
    do shell script "cd " & quoted form of temp_dir & "; mv ./* ../"
  end tell
end repeat

on getSelection()
  tell application "Mail"
    set a to selection
    if (count of a) < 1 then
      error "Eine Mitteilung muss ausgewählt sein."
    end if
    return a
  end tell
end getSelection

on replace_chars(this_text, search_string, replacement_string)
  if this_text contains the search_string then
    set od to AppleScript's text item delimiters
    set AppleScript's text item delimiters to the search_string
    set the item_list to every text item of this_text
    set AppleScript's text item delimiters to the replacement_string
    set this_text to the item_list as string
    set AppleScript's text item delimiters to od
  end if
  return this_text
end replace_chars

									

15 thoughts on “Apple Mail: EMLX-Datei der ausgewählte Nachricht speichern

  1. Olaf Kwade says:

    Endlich, ich habe lange nach seinem script gesucht!!! Haben Sie auch eine Möglichkeit die Betreffzeile und das Maildatum mit in den Dateinamen zu schreiben. Ich habe leider keine Ahnung wie das funktioniert. Über eine Rückmeldung wäre ich sehr sehr dankbar. Gruß olaf kwade

  2. Hans says:

    Sorry, ganz vergessen: Es handelt sich um 10.8 (alle Updates eingespielt).
    Ansonsten ist die Fehlermeldung gleich. Ok, ich habe es mit einer anderen Datei probiert, daher ist der Mittelteil anders. Danke vorab.

    • hubi says:

      Ok, ich habe hier gerade kein 10.8 zum Testen… aber unter 10.7 gab es den gleichen Fehler…. war ein Pfad der nicht “gequoteted” war…. sollte jetzt funktionieren. Einfach noch einmal die letzte Code-Version kopieren.

    • Hans says:

      Perfekt. Der Fehler ist bereinigt- Herzlichen Dank dafür.

      Das Script läuft eigentlich nun durch. Leider habe ich nun einen neuen Fehler.

      Wenn ich für einen Versuch ca. 30 Mails markiere und dann das Script starte bleibt das Script ab und zu hängen und bringt mit diesen Fehler:

      Mail“ hat einen Fehler erhalten: „to recipient 1 of message id 46784 of mailbox "TEMP"“ kann nicht gelesen werden. Ungültiger Index.

      Das Script selber bleibt an dieser Stelle hängen:
      set account_name to address of to recipient 1 of mymail und zwar bei dem wort “address”.

      Nun habe ich den Index neu aufgebaut und nach dem der Fehler wieder hochgekommen ist auch die Mails in einen anderen Ordner verschoben. Es handelt sich hierbei um einen lokalen Ordner.

      Erste Prüfungen haben ergeben, dass es sich dabei immer um eMails handelt, die z.B. ein PDF im Anhang haben, welches zwar in der Mail eingebunden ist, jedoch zusätzlich in dem Ordner “Attchments” ist, der parallel zum Ordner Messages ist. Ich spreche hier nicht vom Download Ordner.

      Bsp:
      ~/Library/Mail/V2/Mailboxes/TEMP.mbox/6D59FCF3-08EF-4157-9A2F-FC73387F083B/Data/6/4/Attachments/…
      ~/Library/Mail/V2/Mailboxes/TEMP.mbox/6D59FCF3-08EF-4157-9A2F-FC73387F083B/Data/6/4/Messages/…

      Vielleicht kannst Du mit meinen Ergebnisse etwas anfangen. Herzlichen Dank vorab.

  3. I needed to thank you for this good read!! I certainly loved every bit of it.
    I have you book marked to check out new things you post…

  4. Thomas says:

    Vielen Dank für das super Skript!
    Ich habe es um die Uhrzeit ergänzt, möchte aber die “/” vermeiden und durch “-” ersetzen.
    Kannst du das noch im Skript erweitern?

    Grüße

    • hubi says:

      Servus Thomas,

      die Zeile replace(DeineZeit, "/","-") sollte es richten… Da die Funktion im Quellcode bereits vorhanden ist, überlasse ich Dir diese kleine Anpassung ;-)

      • Thomas says:

        Hallo Hubi,

        leider habe ich das erste mal mit Applescript zu tun und bin etwas überfordert ;)

        Ich habe das Skript folgendermaßen erweitert:

        set thesubject to subject of mymail
        set thesubject to my replace_chars(thesubject, “/”, “-“)
        set thesubject to my replace_chars(thesubject, “:”, “-“)

        set thedate to date received of mymail
        set thedate to (year of thedate) & “-” & (month of thedate as integer) & “-” & (day of thedate) & ” _ ” & (time string of thedate) as rich text
        set thedate to my replace_chars(thedate, “/”, “-“)

        Der Dateiname siehr dann z.B. foldendermaßen aus:
        “2015-7-23 _ 12/10/31 – Hier steht der Betreff 2372.emlx”

        Wie muss ich das Script erweitern, dass die Uhrtzeit der Mail z.b. so angezeigt wird:
        “2015-7-23 _ 12-10-31 – Hier steht der Betreff 2372.emlx”

        PS: Ist es möglich bei Auführung des Skripts nach dem Speicherort der Dateien zu fragen?

  5. Wolfgang says:

    Hallo Hubi!
    Wie kann man
    1. die Mails als eml statt emlx speichern
    und (wichtiger)
    2. die mails beim speichern ungeteilt lassen?
    Vielen Dank,
    Wolfgang

Leave a Reply