• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Viele hassen ihn, manche schwören auf ihn, wir aber möchten unbedingt sehen, welche Bilder Ihr vor Eurem geistigen Auge bzw. vor der Linse Eures iPhone oder iPad sehen könnt, wenn Ihr dieses Wort hört oder lest. Macht mit und beteiligt Euch an unserem Frühjahrsputz ---> Klick

Gesucht: PDF Mailanhang ausdrucken

jochen

Erdapfel
Registriert
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
 

hubionmac

Tydemans Early Worcester
Registriert
25.06.04
Beiträge
393
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
 
Zuletzt bearbeitet:

LittlePixel

Strauwalds neue Goldparmäne
Registriert
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
 

hubionmac

Tydemans Early Worcester
Registriert
25.06.04
Beiträge
393
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
 
Zuletzt bearbeitet:

LittlePixel

Strauwalds neue Goldparmäne
Registriert
09.07.08
Beiträge
641
Hallo hubi,

Könntest Du dazu schreiben warum?
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
 

hubionmac

Tydemans Early Worcester
Registriert
25.06.04
Beiträge
393
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.

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
 

jochen

Erdapfel
Registriert
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
 

Zymot

Golden Delicious
Registriert
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 = [email protected] 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??
 

Zymot

Golden Delicious
Registriert
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???
 

Pill

Adams Parmäne
Registriert
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.
 

Zymot

Golden Delicious
Registriert
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! ;)
 

MacAlzenau

Golden Noble
Registriert
26.12.05
Beiträge
22.502
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)
Schon mal falsch. Intelligente Postfächer sind Suchabfragen, da wird nichts verschoben, da wird nur verlinkt.
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...
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).
 

Zymot

Golden Delicious
Registriert
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.
 

Pill

Adams Parmäne
Registriert
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
 

Zymot

Golden Delicious
Registriert
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...
 

MacAlzenau

Golden Noble
Registriert
26.12.05
Beiträge
22.502
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.
 

Pill

Adams Parmäne
Registriert
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"