1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

Gesucht: PDF Mailanhang ausdrucken

Dieses Thema im Forum "AppleScript" wurde erstellt von jochen, 30.08.09.

  1. jochen

    jochen Erdapfel

    Dabei seit:
    28.08.09
    Beiträge:
    5
    Ich suche jemanden, der mir die folgende Funktion (selbstverständlich gegen Bezahlung) mit AppleScript umsetzen kann. Ziel ist, die PDF-Anhänge von E-Mails automatisch auszudrucken:

    1. Apple Mail ist bereits geöffnet
    2. Neue E-Mails von einem bestimmten, bereits eingerichtetem Mail Account wurden einlesen
    3. Es kann davon ausgegangen werden, dass im Posteingang immer Mails vorhanden sind
    4. Für ALLE Mails im Posteingang die folgende Aktion ausführen:
    - Mail öffnen
    - falls die E-Mail keinen Anhang enthält: in den Ordner "nicht gedruckt" verschieben
    - falls die Mail einen Anhang enthält (es ist dann immer genau 1 Anhang, und zwar immer eine PDF Datei):
    * PDF Dokument öffnen
    * PDF Dokument zweimal auf dem Standarddrucker ausdrucken (nur in die Druckerwarteschlange einfügen, nicht warten bis das Dokument fertig gedruckt ist)
    * PDF Dokument schließen
    * E-Mail in den Ordner "gedruckt" verschieben

    OPTION (nur falls möglich):
    wenn das PDF Dokument ein bestimmtes Wort enthält, soll das Dokument nur einmal gedruckt werden. Ist das Wort nicht vorhanden, wird es zweimal ausgedruckt.

    Die PDF Dokumente bestehen überwiegend aus Text und sind 1-3 Seiten lang.

    Beim Aufruf befinden sich jeweis meist 50-100 Mails auf dem Mailserver, es können aber auch manchmal 200-400 sein.

    Sollte der Ausdruck aus irgendeinem Grund fehlschlagen, würde ich einfach die Mails vom Ordner "gedruckt" wieder in den Posteingang schieben und das Script erneut starten.

    Leider habe ich nicht die Zeit, mich selbst in AppleScript einzuarbeiten.

    Wäre toll, wenn mir das jemand umsetzen kann und freue mich auf Angebote.

    Jochen
     
  2. hubionmac

    hubionmac Rheinischer Krummstiel

    Dabei seit:
    25.06.04
    Beiträge:
    379
    Nun denn, dann spende mal etwas auf meiner Seite, wenn das Ding hier funktioniert... :-D (getestet unter 10.6.1)
    In den Skript-Editor kopieren und ausführen... der Rest sollte sich so erklären.

    Ok, kurze Info dazu:
    • Beim ersten Durchlauf fragt dich das Skript nach
      gewissen Voreinstellungen, (sollen nur ungelesene
      Emails berücksichtigt werden, welcher Account von und
      in welche Mailboxes...)
    • Das Ding läuft dann durch und druckt jedes PDF über
      einen Terminal-Befehl (lb) aus. Das heisst, der
      Ausdruck kommt über deinen Standard-Drucker raus.
    • Anschließend wird die Email als gelesen markiert und
      in den jeweiligen Ordner verschoben.
    • Ganz am Anfang des Quellcodes kannst Du (das wird
      nicht in den Voreinstellungen gespeichert)
      search_for_string auf true setzten und in den PDFs nach
      einem String suchen lassen. Das läuft über spotlight,
      d.h. es wird stumpf nach dem string im gesamten PDF
      gesucht, sollte er also nicht im Text, sonder
      vielleicht auch im Titel oder so auftauchen, wird da
      Ding auch 2x gedruckt.
      Auf Grund von einer
      gewissen Zeit, die das System benötigt, um den Index
      für das neue PDF zu erstellen, wartet das Skript
      pauschal 5 Sekunden (sollte vermutlich reichen) und
      sucht dann erst nach dem String, damit die Suche auch
      ein Ergebnis liefern kann.​
      Das ist also alles nicht so 100%ig, aber zumindest 1x
      wird es auf jeden Fall gedruckt
    • Solltest Du einmal die Voreinstellungen änder
      wollen, diese sind unter
      ~/Library/Preferences/com.hubionmac.move_print_mails_applescript_prefs.txt
      gespeichert. Diese am einfachsten löschen
      und die Einstellungen erneut durch das Skript
      abspeichern lassen.

    Code:
    property search_for_string : false
    property search_string : "Blafasel"
    
    property name_account : ""
    property nur_ungelesene : ""
    property name_Inbox_mailbox : ""
    
    property name_was_printed_mailbox : ""
    property name_not_printed_mailbox : ""
    property theAttachmentPath : ""
    
    
    set pref_list to check_pref_file()
    set name_account to item 1 of pref_list
    set nur_ungelesene to (item 2 of pref_list) as integer
    set name_Inbox_mailbox to item 3 of pref_list
    set name_was_printed_mailbox to item 4 of pref_list
    set name_not_printed_mailbox to item 5 of pref_list
    set theAttachmentPath to item 6 of pref_list
    get nur_ungelesene
    tell application "Mail"
    	set themessages to every message of mailbox name_Inbox_mailbox of account name_account
    end tell
    set counter to 0
    repeat with m in themessages
    	if nur_ungelesene = 1 then
    		tell application "Mail" to set read_status to read status of m
    		if read_status = false then
    			move_print_emails(m)
    			set counter to counter + 1
    		end if
    	else
    		move_print_emails(m)
    		set counter to counter + 1
    	end if
    end repeat
    display dialog "Aktion wurde auf " & counter & " Emails angewendet." giving up after 3
    
    
    on move_print_emails(m)
    	tell application "Mail" to set a_count to (count of every mail attachment of m)
    	if a_count = 0 then
    		tell application "Mail"
    			--set read status of m to true
    			move m to mailbox name_not_printed_mailbox of account name_account
    		end tell
    	else
    		set foundone to false
    		tell application "Mail" to set current_attachments to every mail attachment of m
    		repeat with a in current_attachments
    			tell application "Mail" to set current_a_name to name of a
    			repeat with endung in {".pdf"}
    				if (current_a_name as text) ends with (endung as text) then
    					set foundone to true
    					set FileName to checkname_with_pdf_suffix(current_a_name, theAttachmentPath, false)
    					tell application "Mail" to save a in theAttachmentPath & FileName
    					set thefile to (POSIX path of ((theAttachmentPath & FileName) as alias))
    					print_file(thefile, search_for_string, search_string)
    					tell application "Mail" to set read status of m to true
    					tell application "Mail" to move m to mailbox name_was_printed_mailbox of account name_account
    				end if
    			end repeat
    		end repeat
    		if foundone = false then
    			tell application "Mail" to move m to mailbox name_not_printed_mailbox of account name_account
    		end if
    		
    	end if
    end move_print_emails
    
    
    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
    			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
    			checkname_with_pdf_suffix(n, D, true)
    		end if
    	else
    		return n
    	end if
    	
    end checkname_with_pdf_suffix
    
    
    on check_pref_file()
    	try
    		tell application "Finder"
    			set the_file to ((home as text) & "Library:Preferences:com.hubionmac.move_print_mails_applescript_prefs.txt") as alias
    			set pref_list to read the_file as list
    		end tell
    		return pref_list
    	on error
    		tell application "Finder"
    			do shell script "touch ~/Library/Preferences/com.hubionmac.move_print_mails_applescript_prefs.txt"
    			set the_file to ((home as text) & "Library:Preferences:com.hubionmac.move_print_mails_applescript_prefs.txt") as alias
    		end tell
    		set pref_list to get_info()
    		tell application "Finder"
    			open for access the_file with write permission
    			set eof of the_file to 0 -- die alten daten überschreiben
    			write (pref_list) to the_file starting at eof as list
    			close access the_file
    		end tell
    		return pref_list
    	end try
    	
    end check_pref_file
    
    on get_info()
    	set pref_list to {"", "", "", "", "", "", ""}
    	try
    		tell application "Mail" to set alist to name of every account whose enabled is true
    		set a to choose from list alist with prompt "Welcher account?"
    		build_list(pref_list, a, 1)
    		set a to choose from list {"Alle Emails", "nur ungelesene"} with prompt "Welche Emails?"
    		if (a as text) = "Alle Emails" then
    			set a to 0
    		else
    			set a to 1
    		end if
    		build_list(pref_list, a, 2)
    		tell application "Mail" to set alist to name of every mailbox of account (item 1 of pref_list)
    		set a to choose from list alist with prompt "Welche Mailbox durchsuchen?"
    		build_list(pref_list, a, 3)
    		set a to choose from list alist with prompt "Gedruckte Emails bewegen in?"
    		build_list(pref_list, a, 4)
    		set a to choose from list alist with prompt "NICHT Gedruckte Emails bewegen in?"
    		build_list(pref_list, a, 5)
    		set a to (choose folder with prompt "Wohin die Anhänge sichern???") as text
    		build_list(pref_list, a, 6)
    		return pref_list
    	on error
    		error "Dann halt nicht"
    	end try
    end get_info
    
    on print_file(thefile, hasToContain, searchString)
    	if hasToContain = true then
    		set filecontainer to do shell script "dirname " & quoted form of thefile
    		--muss warten, damit spotlight mit dem index nachkommt... hoffentlich =)
    		delay 5
    		if (do shell script "mdfind -onlyin " & quoted form of filecontainer & " " & quoted form of searchString) contains thefile then
    			--2x drucken
    			do shell script "lp " & quoted form of thefile
    			do shell script "lp " & quoted form of thefile
    			
    		else
    			--1x drucken
    			do shell script "lp " & quoted form of thefile
    			
    		end if
    	else
    		--1x drucken
    		do shell script "lp " & quoted form of thefile
    		
    	end if
    	
    end print_file
    
    on build_list(the_list, thevalue, pointer)
    	if thevalue ≠ false then
    		set item pointer of the_list to thevalue as text
    	else
    		error "Dann halt nicht"
    	end if
    	return the_list
    end build_list
    
    
    
     
    #2 hubionmac, 19.09.09
    Zuletzt bearbeitet: 19.09.09
  3. LittlePixel

    LittlePixel Strauwalds neue Goldparmäne

    Dabei seit:
    09.07.08
    Beiträge:
    641
    Hallo hubi,

    vielen Dank für Deine Bemühungen. Da wird sich jemand freuen.
    Ich habe ein paar Kritikpunkte:

    So sollte die Pfadangabe in das Pref Verzeichnis angeben werden:
    - path to preferences folder from user domain

    Handler aufruf:
    - sollte immer mit my erfolgen

    Einstellungen werden nicht als txt, sondern als plist gesichert
    - System Events > property list file

    Viele Grüße
     
  4. hubionmac

    hubionmac Rheinischer Krummstiel

    Dabei seit:
    25.06.04
    Beiträge:
    379
    Könntest Du dazu schreiben warum?

    zu den Prefs
    die Datei heißt nicht .plist, weil es keine ist, also keine xml-Datei, sondern nur reiner text in einem Format, welches wohl nur AppleScript und nicht defaults versteht
     
    #4 hubionmac, 20.09.09
    Zuletzt bearbeitet: 20.09.09
  5. LittlePixel

    LittlePixel Strauwalds neue Goldparmäne

    Dabei seit:
    09.07.08
    Beiträge:
    641
    Hallo hubi,

    Welchen Punkt meinst Du konkret?

    • Standardpfade, wie es auch der preferences folder ist, sind somit einfacher anzugeben und das wichtigste ist er wird in auch in Zukunft funktionieren.
    Wenn Apple Morgen hingeht und den Ordner umbenennt, dann wird Dein Skript nicht mehr funktionieren.
    Mit dem Property Aufruf aber sehr wohl, da Apple das alles für Dich im Hintergrund geändert hat.
    Das gleiche gilt auch für den Musikordner, Dokumentenordner usw.
    Man sollte da bitte Apples Dokumentation folgen und diese auch berücksichtigen.

    • Zu dem my kann ich nur auf diee Dokumentation verweisen. Skriptobjekte usw.
    Ich glaube gelesen zuhaben, dass es unter 10.6 endlich auch Pflicht ist.

    • Plist, erzeugst Du eben mit "property list file", z.B. http://www.macosxautomation.com/applescript/features/propertylists.html

    Nur um es zu erwähnen:
    Die Kritikpunkte sind natürlich nicht böse gemeint. Es geht lediglich um die Verbesserung für die Zukunft.

    Viele Grüße
     
  6. hubionmac

    hubionmac Rheinischer Krummstiel

    Dabei seit:
    25.06.04
    Beiträge:
    379
    Das ist schön und da bin ich ja auch dankbar für.
    Ist nur schöner, wenn man gleich belegt, weshalb etwas anders gemacht werden sollte, damit man auch was damit anfangen kann.

    Nun gut, war meine erste Google Suche heute. Apple schreibt:
    To call a handler from within a tell statement, you must use the reserved words of me or my to indicate that the handler is part of the script and not a command that should be sent to the target of the tell statement.

    Jetzt verstehe ich auch den Vorteil, mein Code wird letzten Endes kürzer und sauberer =)
    als Beispiel:
    das geht nicht:

    tell application "Finder"
    showDialog(name of home)
    end tell

    on showDialog(a)
    display dialog a
    end showDialog

    -->error "„Finder“ hat einen Fehler erhalten: Fortfahren nicht möglich: showDialog." number -170

    so hätte ich das sonst gemacht...

    tell application "Finder" to set tmp to name of home
    showDialog(tmp)


    on showDialog(a)
    display dialog a
    end showDialog


    und so sollte es sein:

    tell application "Finder"
    my showDialog(name of home)
    end tell

    on showDialog(a)
    display dialog a
    end showDialog
     
  7. jochen

    jochen Erdapfel

    Dabei seit:
    28.08.09
    Beiträge:
    5
    Hubi,

    vielen Dank für den Code, das sieht sehr vielversprechend aus. Ich werde das morgen testen und dann Feedback geben (und natürlich spenden).

    Viele Grüße
    Jochen
     
  8. Zymot

    Zymot Golden Delicious

    Dabei seit:
    26.07.14
    Beiträge:
    6
    Hallo zusammen....
    Bin auf diesen coolen Beitrag gestoßen.... seit Monaten suche ich wie verrückt und experimentiere rum, doch es klappt alles leider nicht...
    Folgendes Szenario...

    (vorab gesagt, ich habe NOCH NIE was mit Applescript gemacht, also weiss nicht wo man die kopiert, wie man die bearbeitet oder wie man die ausführt)

    Empfange Mails mit dem Apple Mail Programm

    es werden ca. 8 verschiedene Konten und ca. 12 verschiedene e_Mail Adresse abgefragt...
    Einzige was ich habe bis jetzt sind intelligente Postfächer, wo Mail nach den von mir vorgegebenen Kriterien aussortiert beim Empfang und darin verschiebt... (z.B. T-Mobile Rechnungen, 1und1 Rechnungen, online SHop Bestellungen, etc)

    das Problem, ich bin manchmal 2-3 Tage nicht im Büro und frage meine Mails per iphone ab, und werden auch dann direkt als gelesen markiert. Und bei 30-60 wichtige Mails am Tag, verliere ich dann nach 2-3 Tagen leicht den überlick was als pdf oder nicht gekommen ist... das merke ich dann spätestens wenn ich die Buchhaltung mache und mir mit dem Kontoauszug die jeweilige Rechnungen raus suchen muss und ausdrucken...
    Der Rechner im Büro ist immer online und an...
    Ich suche ne Möglichkeit, wo ich dem Mail Programm sage,
    prüfe Mail bei Ankunft, wenn Absender = T-comxxx@telekomxx.de ist und Betreff = Ihre Rechnung xxx und im Anhang sich ein PDF befindet, dann bitte die PDF Dateien direkt drucken.

    die pdf sollte aber nicht in irgend ein tmp Verzeichnis bleiben, denn das häuft sich ja dann sonst....


    ist sowas möglich??
     
  9. Zymot

    Zymot Golden Delicious

    Dabei seit:
    26.07.14
    Beiträge:
    6
    keiner eine idee???
     
  10. Pill

    Pill Adams Parmäne

    Dabei seit:
    07.07.12
    Beiträge:
    1.310
  11. Zymot

    Zymot Golden Delicious

    Dabei seit:
    26.07.14
    Beiträge:
    6
    vielen Dank für Deine schnelle Antwort...
    Ist denn in dem langen letzten Script auch das Problem berücksichtigt, dass die Mails nicht doppelt oder jedes mal gedruckt werden???
     
  12. Pill

    Pill Adams Parmäne

    Dabei seit:
    07.07.12
    Beiträge:
    1.310
    Das Skript wird durch eine Mailregel ausgelöst. Das heißt jedes mal, wenn die Mailregel eine Mail in den Ordner "Rechnungen" verschiebt, dann wird diese Mail gedruckt.

    Ich habe das Skript nicht getestet, sondern nur überflogen. Es sollte sich aber mit relativ wenig Aufwand auf deine Bedürfnisse anpassen lassen.
     
  13. Zymot

    Zymot Golden Delicious

    Dabei seit:
    26.07.14
    Beiträge:
    6
    Ich habe NULL Ahnung von Applescript oder allgemein Programmieren..... :)
    Was heisst für Dich mit relativ wenig Aufwand???
    Ich wüsste nichtmal, WAS ich WO anpassen muss! ;)
     
  14. MacAlzenau

    MacAlzenau Golden Noble

    Dabei seit:
    26.12.05
    Beiträge:
    19.401
    Schon mal falsch. Intelligente Postfächer sind Suchabfragen, da wird nichts verschoben, da wird nur verlinkt.
    Zum Skript kann ich nichts sagen, aber wenn du die Anhänge unter OS X öffnest, werden sie automatisch nach ~/Library/Gesendete Mailanhänge (oder so ähnlich) kopiert. Möglicherweise ist das unter iOS genauso, möglicherweise hilft das weiter - man könnte da vielleicht statt eines Skripts den Weg über eine Ordneraktion gehen (ich denke allerdings, daß sich das dann nicht so fein regeln lässt wie gewünscht).
     
  15. Zymot

    Zymot Golden Delicious

    Dabei seit:
    26.07.14
    Beiträge:
    6
    ich meinte ja nur "virtuell verschoben".

    Das mit den ordneraktionen klappt nicht so gut, denn der druckt dann immer wieder alles...
    Man muss dem irgendwie erklären, dass er die gedruckten nicht nochmal drucken soll etc.
     
  16. Pill

    Pill Adams Parmäne

    Dabei seit:
    07.07.12
    Beiträge:
    1.310
    Ein Anfang wäre mal das Skript zu testen. Dazu musst du nur den Pfad in der ersten Zeile anpassen, das Skript im angegeben Ordner speichern und eine entsprechende Mailregel erstellen.

    Dieses PDF ist schon etwas älter, das meiste ist aber immer noch aktuell:
    http://www.fischer-bayern.de/as/as4as/AS4AS_g.pdf
     
  17. Zymot

    Zymot Golden Delicious

    Dabei seit:
    26.07.14
    Beiträge:
    6
    Hallo Pill, ich habe eine kaffeerösterei und bin in der Regel zwischen 10-14 Stunden außer Haus (Büro und Kundenbesuche), habe vom Programmieren NULL Ahnung, und um ehrlich zu sein, möchte ich es momentan auch nicht lernen...
    Ich habe leider keine Zeit mich dahin zu setzen und eine 90seitige PDF einzustudieren nur um mein Problem zu lösen...
    Dafür gibt es ja "meiner Meinung nach" ein Forum...
    FALLS, unter Euch jemand schonmal das gleiche oder ähnliche Problem hatte und es gelöst hat, kann er ja hier die Lösung posten, wenn nicht, und es einen spass macht oder interessiert oder für ihn kein problem darstellt, kann er auch das Problem lösen...
    Ich bin auch gerne bereit jemand für diese Arbeit zu bezahlen... Aber ich wiederhole mich, ich kann leider jetzt nicht anfagen für jedes problem was ich habe, was neues dazulernen...
    Man geht ja auch zum Arzt oder Mechaniker oder sonstiges wenn man ein Problem hat und fängt nicht an Medizin zu studieren...
    In einem Forum wird ja keiner gezwungen was zu machen...
    ich schreibe aktiv auch in diverse kaffee/espresso oder Kaffeemaschinen Foren und helfe Leuten bei Ihren Problemen, da es mir spass macht und ich mich mit der materie auskenne...

    Trotzdem vielen dank, an alle...
     
  18. MacAlzenau

    MacAlzenau Golden Noble

    Dabei seit:
    26.12.05
    Beiträge:
    19.401
    Kopf hoch! Und du hast recht, Foren sind dafür da, einzelne Fragen zu klären, statt ein Studium zu empfehlen.
    Aber Foren sind auch keine Hot lines, und jetzt sind sicher etliche Spezialisten im Urlaub.
    Für Apple Skripte gibt es außerdem ein spezielles Forum, http://www.fischer-bayern.de/applescript/index.php, vielleicht da mal nachfragen, da sitzen die Experten.
    Ich drück dir die Daumen.
     
  19. Pill

    Pill Adams Parmäne

    Dabei seit:
    07.07.12
    Beiträge:
    1.310
    Das Skript aus #10 ist eine Lösung für dein Problem. Ein bisschen Eigeninitiative ist leider notwendig. Du musst nicht AppleScript lernen, aber in dem PDF gibt es hilfreiche Kapitel wie z.B. "Ausführen und Sichern eines Skripts"
     

Diese Seite empfehlen