Push-Nachrichten von MacTechNews.de
Würden Sie gerne aktuelle Nachrichten aus der Apple-Welt direkt über Push-Nachrichten erhalten?
Journals>Journals von MrChad>PDF-Anhänge automatisiert aus eingehender Mail extrahieren - Teil 1

PDF-Anhänge automatisiert aus eingehender Mail extrahieren - Teil 1

Im Netz kursieren verschiedene Versionen eines Applescripts, die automatisiert PDF-Anhänge aus eingehenden Mails extrahieren sollen. Leider funktionieren diese nur so la-la und versagen oft.


Diesen Scripts ist vieles gemeinsam und sie versagen typischerweise an der entscheidenden Stelle mit wechselnden Fehlern:
save oneAttachment in file (destFolder & theName) -- (oder ähnlich)
Es hat den Anschein, als ob die Kombination Applescript & Mail mit komplexer aufgebauten MIME-Messages nicht richtig umgehen kann.

Um den Fehler zu beseitigen, habe ich mir eine etwas andere Methode einfallen lassen:
  • In einem ersten Schritt extrahiert ein Applescript die komplette Mail inkl. Anhänge als Datei
  • Im zweiten Schritt nutze ich ein selbstgeschriebenes Programm zur Extraktion der PDF-Anhänge. Dieses Programm beschreibe ich im Teil 2:

Einige Voraussetzungen - kann man natürlich im Script anpassen:
  • Man legt einen Ordner unterhalb von Dokumente an, voreingestellt ist mailDrop
  • Man legt in Mail einen Mail-Ordner unterhalb von INBOX an, voreingestellt ist dropArchive
Möglicherweise verwenden andere Mail-Server eine etwas andere Syntax und Ordnerstruktur, dann muss das Script entsprechend angepasst werden

Das Applescript bindet man wie gewohnt und hier beschrieben in die Mail-Regeln ein:

Bis hierher wird das Script nur eingegangene Mail entsprechend der Regeln als .eml-Datei in den mailDrop-Ordner kopieren und die bearbeitete Mail in den Mail-Unterordner verschieben.
Für die Extraktion der PDF-Anhänge benötigt man zusätzlich das externe Programm, das ich hier im Teil 2 beschrieben habe:

Übrigens:
Solange der Ordner oder symlink ~/GetPdfFromEml und das zugehörige Programm nicht existiert, passiert im Script beim Aufruf von
try
    do shell script appName
end try        
ganz genau: garnix.

Zur besseren Übersicht folgt das komplette Applescript im ersten Kommentar.
Damit das Skript kompakt und leicht verständlich bleibt, habe ich hier das ganze Logging und die Fehlerbehandlung herausgestrichen.

Kommentare

MrChad04.03.23 08:56
using terms from application "Mail"
    on perform mail action with messages these_messages for rule this_rule
        tell application "Mail"
            set docName to (path to documents folder) as string

            -- 
            set dropFolder to docName & "mailDrop:" -- ein Ordner unter "Dokumente"
            set mailFolder to "dropArchive" -- ein Mail-Ordner unter INBOX
            --
            
            repeat with this_message in these_messages
                tell this_message
                    set these_attachments to every mail attachment
                    
                    if (count of (every mail attachment)) > 0 then
                        set emlFileName to ((id of this_message) as string) & ".eml"
                        set isNew to false
                        try
                            emlFileName as alias
                            -- existiert schon, nix zu tun
                        on error
                            set isNew to true
                        end try
                        
                        if isNew then
                            try
                                set emlFile to open for access (attachments_folder & emlFileName) with write permission
                                write (source of this_message) to emlFile
                                close access emlFile
                                
                                -- move message to folder
                                try
                                    move this_message to (mailbox ("INBOX/" & mailFolder) of (account of (mailbox of this_message)))
                                end try
                            end try
                        end if
                end tell
            end repeat
        end tell
        
        set posixHome to (quoted form of POSIX path of (path to home folder))

        -- ein Ordner oder symlink unterhalb von ~ (home)
        set appName to posixHome & "/GetPdfFromEml/GetPdfFromEml"
        --
        try
            do shell script appName
        end try        
        
    end perform mail action with messages
end using terms from

Kommentieren

Sie müssen sich einloggen, um diese Funktion nutzen zu können.