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
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
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
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
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
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
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
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??
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???
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.
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!
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).
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.
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
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...
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.
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"