Mail-Regel-Skript: Attachments sichern

Hier ein simples Skript, welches Anhänge von Emails in einem vordefinierten Ordner sichert. Das kann man an eine Mail-Regel hängen.

-- hubionmac.com 2010-01
-- script to be added to a Apple Mail rule
--saves attachmens of new mails into a folder
on perform_mail_action(info)
  tell application "Mail"
    tell application "Finder" to set mypath to (folder "Mail Attachments Saved" of desktop) as text
    set theMessages to |SelectedMessages| of info
    repeat with thisMessage in theMessages
      try
        repeat with a in (every mail attachment of thisMessage)
          set current_a_name to name of a
          set current_a_name to my checkname_with_pdf_suffix(current_a_name, mypath as alias, false)
          save a in mypath & current_a_name
        end repeat
      on error msg
        do shell script "echo " & quoted form of msg & " | cat>>~/Desktop/MailscriptErrorLog.txt"
      end try
    end repeat
  end tell
end perform_mail_action


on checkname_with_pdf_suffix(n, D, looped)
  tell application "Finder"
    set thefiles to name of every item of (D as alias)
  end tell
  if thefiles contains n then
    if looped = false then
      set n to ((characters 1 through -5 of n) & " 1" & (characters -4 through -1 of n)) as text
      my checkname_with_pdf_suffix(n, D, true)
    else
      set tmp to (last word of ((characters 1 through -5 of n) as text) as integer)
      set tmpcount to (count of characters of (tmp as text)) + 5
      set tmp to tmp + 1
      set n to ((characters 1 through (-1 * tmpcount) of n) & tmp & (characters -4 through -1 of n)) as text
      my checkname_with_pdf_suffix(n, D, true)
    end if
  else
    return n
  end if
end checkname_with_pdf_suffix
									

Update von 2012-06-19

-- hubionmac.com 2010-01
-- script to be added to a Apple Mail rule
--saves attachmens of new mails into a folder
-- hubionmac.com 2012-06-19 (update4Christoph)
--changed the script a bit, so it saves the Attachments in a subfolder with the email's subject
--and removed the tell finder call with a more general one
on perform_mail_action(info)
  tell application "Mail"
    set rootpath to POSIX path of (path to "desk") & "Mail Attachments Saved/"
    
    set theMessages to |SelectedMessages| of info
    repeat with thisMessage in theMessages
      if (count of every mail attachment of thisMessage) > 0 then
        set thesubject to my replace_string(my replace_string(subject of thisMessage, ":", "-"), "/", "-")
        do shell script "mkdir -p " & (quoted form of (rootpath & thesubject & "/") as string)
        set mypath to (((rootpath & thesubject & "/") as string) as POSIX file) as alias
      end if
      try
        repeat with a in (every mail attachment of thisMessage)
          set current_a_name to name of a
          set current_a_name to my checkname_with_pdf_suffix(current_a_name, mypath as alias, false)
          save a in (mypath & current_a_name as string)
        end repeat
      on error msg
        do shell script "echo " & quoted form of msg & " | cat>>" & quoted form of rootpath & "MailscriptErrorLog.txt"
      end try
    end repeat
  end tell
end perform_mail_action


on checkname_with_pdf_suffix(n, D, looped)
  tell application "Finder"
    set thefiles to name of every item of (D as alias)
  end tell
  if thefiles contains n then
    if looped = false then
      set n to ((characters 1 through -5 of n) & " 1" & (characters -4 through -1 of n)) as text
      my checkname_with_pdf_suffix(n, D, true)
    else
      set tmp to (last word of ((characters 1 through -5 of n) as text) as integer)
      set tmpcount to (count of characters of (tmp as text)) + 5
      set tmp to tmp + 1
      set n to ((characters 1 through (-1 * tmpcount) of n) & tmp & (characters -4 through -1 of n)) as text
      my checkname_with_pdf_suffix(n, D, true)
    end if
  else
    return n
  end if
end checkname_with_pdf_suffix

on replace_string(itemname, searchstring, replacestring)
  set old_delimiter to AppleScript's text item delimiters
  set AppleScript's text item delimiters to searchstring
  set the item_list to every text item of itemname
  set AppleScript's text item delimiters to replacestring
  set this_text to the item_list as string
  set AppleScript's text item delimiters to old_delimiter
  return this_text
end replace_string
									

Update von 2012-08-08

Damit läuft das ganze auch unter 10.8 Mountain Lion (hat etwas mit Sandbox-Regeln zu tuen, die verhindern, dass Mail Attachments via Script in einem anderen Ordner speichert, als dem Downloads-Ordner). Kann man aber einfach aushebeln, da das Script selber die Datei natürlich sonstwohin speichern darf. (siehe auch)

-- hubionmac.com 2012-08-08
-- script to be added to a Apple Mail rule
--saves attachmens of new mails into a SomeOtherFolder (just change path to what you like )  (REPLACES EXISTING FILES!)
--new version since 10.8 limits saving attachments to donwnloads-folder + some other mail rule specific stuff

using terms from application "Mail"
  on perform mail action with messages theMessages for rule theRule
    tell application "Mail"
      --der Downloads Ordner (in den darf Mail seit 10.8 nur noch Dateien sichern)
      set downloadFolder to ((path to home folder) as rich text) & "Downloads:"
      --der eigentliche Zielpfad
      tell application "Finder" to set mypath to quoted form of POSIX path of (((path to home folder) as text) & "SomeOtherFolder:" as alias)
      repeat with thisMessage in theMessages
        try
          repeat with a in (every mail attachment of thisMessage)
            set current_a_name to name of a
            --Mail sichert brav die Datei im Downloads-Ordner (und überschreibt dabei ggf. gleichnahmige Dateien)!!!
            save a in downloadFolder & current_a_name
            set thefile to quoted form of POSIX path of (downloadFolder & current_a_name as alias)
            --und im nächsten Schritt wird die Datei an den Zielort bewegt… das Skript darf ja alles, nur AppleMail halt nicht.
            -- Gleichnamige Dateien werden dabei überschrieben!!!!
            do shell script "mv -f " & thefile & " " & mypath
            
          end repeat
        on error msg
          do shell script "echo " & quoted form of msg & " | cat>>~/Desktop/MailscriptErrorLog.txt"
        end try
      end repeat
    end tell
  end perform mail action with messages
end using terms from
									

13 thoughts on “Mail-Regel-Skript: Attachments sichern

  1. abi says:

    das script ist ja fantastisch :)
    1 fragen habe ich allerdings:
    ich möchte gerne mehrere mails > 300 gleichzeitig so abarbeiten. was müsste ich im script ändern?
    grüsse aus der schweiz,
    abi

  2. hubi says:

    Eigentlich musst Du nur etwas weg nehmen.
    on perform_mail_action(info) und end perform_mail_action(info)
    Das ist alles. Dann einfach die betreffenden Emails auswählen und das Skript anfeuern.

  3. vati says:

    Hallo zusammen,

    wie kann ich das Script nur für bestimmte Anhänge verwenden?
    Also Anhänge, mit bestimmten Namen oder Mails mit bestimmtem Betreff.

    Danke & Viele Grüße
    der Vati

  4. Hubi says:

    Schau’ doch mal in den Regeln in Mail nach.. dort kannst Du den Betreff und den Namen des Attachments mit als Bedingung angeben.

  5. vati says:

    Hallo Hubi,

    ich hab schon alles voreingestellt. Ich kann die Mail auch gut über Regeln selektieren. Nun möchte ich, dass das script den Anhang der selektierten Mail in einem bestimmten Pfad speichert und falls die Datei dort schon existiert, soll er diese mit der neueren ersetzen.
    Hier fehlt mir aber leider das Know-how. Ich kenne mich nur etwas mit VBA aus.

    Danke & Viele Grüße
    der Vati

  6. Hubi says:

    Schau’ Dir doch mal an, wie die Variable mypath gesetzt wird und lasse mal die Zeile vor dem sichern der Datei (save a in mypath…. ) mal weg, ich denke das sollte es sein….

  7. […] eine leicht erweiterte Version diese Skriptes…. Code zum markieren einmal anklicken Code im Skript-Editor […]

  8. jannis says:

    Sorry aber ich bin echt neu in sowas. check nicht wo ich den pfad setze wo der anhang hingespeichert werden soll…

  9. Thomas Klein says:

    Hallo Hubi.

    Sorry, aber ich bin soeben auf obiges Skript gestossen und ich hätte eine bitte an dich. Kannst Du vielleicht eine neue Version dieses Script erstellen welche nur die Mail als PDF erstellt und nicht nur die Anlage.

    Ich könnte dann über das obige Originalscript eine Mailregel erstellen die die Mail als ‘Mail1.pdf’ speichert und das neue Script speichert dann eine eventuelle Anlage als ‘Mail1-Anlage.pdf”.

    Danke im Voraus.
    Thomas

    • Hubi says:

      Ich verstehe nicht… das macht doch schon das Skript, aber das umwandeln der Email-Selbst in ein PDF konnte ich bisher nur via GUI-Scripting realisieren… Das Skript hier kann nur die Anlagen speichern, nicht den restlichen Inhalt einer Email

  10. Müller Mike says:

    Hallo Hubi,

    kann man durch den Script auch den Dateinamen der zu Speichernden Datei ändern zB den Namen des Betreffs der eMail? Was muss man schreiben??
    Kann man deinen Script ausser den Pfad zu ändern so verwenden ?
    Sorry hab noch nie mit Script’s gearbeitet

    Danke im Voraus
    MFG
    Mike

  11. Graf Wetter says:

    Hallo Hubi,
    habe dein Script unter 10.7.5 an eine Regel gehängt.
    Bei eintreffender Email und Greifen der Regel wird der Anhang nicht gesichert,
    stattdessen ein Eintrag im ErrorLog:
    „every «class attc»“ kann nicht gelesen werden.

    Wenn ich die Regel änder und danach “Regel jetzt ausführen ?” mit ja bestätige,
    wird der Anhang korrekt in den definierten Ordner gesichert.
    Any idea ?

    Gruß,
    Wetter

  12. Das Script funktioniert sehr gut!

Leave a Reply