• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Der Frühling ist auch in den eingesandten Fotos deutlich zu erkennen. Zeigt uns, wer Euer Favorit ist! hier geht es lang für Euer Voting --> Klick

Script Guru gesucht - Funktion eMail 2 Fax

hwschroeder

Oberösterreichischer Brünerling
Registriert
06.09.06
Beiträge
720
Hallo und guten Abend,

da ich ein Programm für die Funktion nicht gefunden habe, habe ich mir gedacht, frag mal bei den netten Scriptern nach, vielleicht geht das ja von Hand zu Fuss.

Mail ruft alle 10 min ein Postfach [email protected] ab.
Da gibt liegen eMails, die PDF Anhänge haben und eine Nummer in der Betreffzeile.
Über Regeln kann ich ja ein Script starten, und das soll folgendes können:

In der neuen eMail die Nummer aus der Betreffzeile kopieren.
Das anhängende PDF mit Vorschau öffnen.
Drucken / Drucker "Fax" auswählen / kopierte Nummer ins Adressfeld einfügen / Senden

Kann man sowas basteln?
Oder gibt es ein Programm, dass das kann?

Hylafax, GFI Faxmaker, Actifax, habe ich mir alles angeschaut. Eingehende Faxe als eMail weiterleiten ist trivial, aber ankommende eMails wegfaxen, das scheint keiner zu wollen.

Hintegrund:
Ich sitze im Hotel, schicke mir selbst eine eMail mit PDF und mein Mac zu Hause faxt mir die über meine eigene Telefonleitung weg. Oder anders, egal wo ich bin, ich kann faxe senden.

Über eine Idee würde ich mich freuen.
 

toc-rox

Weigelts Zinszahler (Rotfranch)
Registriert
15.11.09
Beiträge
247
"Vorschau" ist nicht skriptfähig, d.h. damit wird es via AppleScript nicht (einfach) gehen. Man kann aber direkt aus Mail ein Fax verschicken - setzt ein Faxmodem voraus.
 
Zuletzt bearbeitet:

-hans-

Jamba
Registriert
02.09.10
Beiträge
56
Hallo hwschroeder,

wenn Du die Pdf-Dateien mit dem Programm Skim (http://skim-app.sourceforge.net/) öffnest, dann kann man UI-Scripting vermeiden.

So könnte es funktionieren, habe nur leider kein Faxmodem zum testen ;):
1.) Ordner auf dem Desktop für die Pdf-Dateien anlegen.
2.) Öffne das Script im ScriptEditor und korrigiere den vorgegebenen Pfad ...
3.) Ändere im Script "DeinFax" in den genauen Namen Deines Faxdruckers
4.) Script sichern und in Mail Deiner Regel zuweisen

Gruß

Hans

Code:
using terms from application "Mail"
	on perform mail action with messages allMessages for rule theRule
		
		--Mac-Pfad zu Deinem Download-Ordner für die PDF-Dateien. Bitte ändern!
		set thePath to "Macintosh HD:Users:hans:Desktop:MailAttachments:"
		
		tell application "Mail"
			activate
			repeat with i from 1 to count of allMessages
				set theMail to item i of allMessages
				
				set theSubject to subject of theMail
				set theAttachments to every mail attachment of theMail
				repeat with OneAttachment in theAttachments
					try
						set theName to name of OneAttachment
						set filePath to (thePath & theName)
						save OneAttachment in filePath
					end try
				end repeat
			end repeat
		end tell
		
		my sendFax(theSubject, filePath)
	end perform mail action with messages
end using terms from

on sendFax(thefaxnumber, pathtofile)
	set pathtofile to pathtofile as alias
	tell application "Skim"
		activate
		try
			open pathtofile
			--"DeinFax" durch den exakten Namen deines Faxdruckers austauschen:
			print document 1 with properties {target printer:"DeinFax", fax number:thefaxnumber} without print dialog
			close document 1
		end try
	end tell
end sendFax
 

hwschroeder

Oberösterreichischer Brünerling
Registriert
06.09.06
Beiträge
720
Hallo und guten Tag,

vielen Dank für den Tip. Ich habe es zwar mittlerweile anders gemacht, aber Dein Script hat mich auf den richtigen Weg gebracht.

1. Zuerst habe ich mir den Teil des Scriptes angeschaut, der Anhänge (meine PDF Dateien) in einem angegebenen Ordner speichert.
2. Dann habe ich die Möglichkeit meines Fax-Servers gefunden, PDF, die als Name <@F211 <Faxnummer>>.pdf haben, direkt zu bearbeiten, wenn die Dateien in einem bestimmten Ordner landen.
3. Dann habe ich mir überlegt, wenn MAIL die eMails laden kann und PDF Anhänge in bestimmten Ordner speichern kann, dann kann das Thunderbird direkt auf dem (Win) Server bestimmt auch.

Einsetzen muss man dazu ein Add-On "Attachment-Extractor", um von eingehenden Mails die angehängten PDF abzutrennen.

Es funktioniert.

Ich sende ein PDF mit dem Namen <Faxnummer>.pdf an die eMail Adresse [email protected].

Thunderbird guckt alle 5 Minuten in dieses Postfach, lädt die Mail, Extractor spaltet das PDF ab und ergänzt gleichzeitig den Dateinamen um das benötigte Steuerzeichen und speichert im Zielordner. Da liegt dann die Datei @F211 030123456.pdf.

Mein Faxprogramm guckt alle paar Minuten in den Ordner, findet ein PDF, weiss, dass hinter @F211 die Faxnummer kommt und sendet das PDF an 030-123456.

Nach dem senden wird das PDF in *.SND oder *.ERR umbenannt (Send / Error) umbenannt, und das ganze startet von Neuem.

Ich danke allen, die mich entsprechenden Tips auf den richtigen Weg gebracht haben.
 

-hans-

Jamba
Registriert
02.09.10
Beiträge
56
Hallo hwschroeder,

Thunderbird ist natürlich eine andere Liga als Mail ;)

Aber grundsätzlich müsste man in dem Applescript nur die Zeile, die den filepath zusammensetzt aendern (und natuerlich den handler rausschmeissen):


set filePath to (thePath & "@F211 " & theSubject & ".pdf")

Schön, dass es klappt :)

Tschüss

Hans
 

hwschroeder

Oberösterreichischer Brünerling
Registriert
06.09.06
Beiträge
720
@hans

Noch einmal Danke. Dein Script hat mich ja erst auf den Weg gebracht :)
Und wenn ich das nächste Mal so eine Lösung "Apple only" stricken muss, dann hab ich das entsprechende Handwerkszeug zur Hand.

Dieses Forum und seine Mitglieder und Mitschreiben rocken. Aber sowas von ;)
 

fyysh

Schweizer Glockenapfel
Registriert
25.01.10
Beiträge
1.386
ich bin leider sehr spät dran mit er antwort hier, aber nachdem ich doch noch dazu gekommen bin, mich mit der geschichte hier auseinanderzusetzen, poste ich hier meine vorläufige lösung.

es ist eine vorläufige, unfertige lösung, die aber funktioniert - bei mir zumindest. eigentlich wollte ich das noch pimpen, aber da das ganze schon gelöst ist, halte ich es für unnötig.


ich habe 2 scripts verwendet:
1 für den mail-filter (regel) und eins für das eigentliche "drucken".


ersteres, das für mail, ist ein bisschen sehr "dahingeschmiert", aber es tut, was es soll: das andere script triggern und mit den entsprechenden daten füttern.

bei dem script muss man 2 dinge anpassen in den ersten beiden zeilen:

printAttachemtScript sollte den posix pfad für PrintAutomation.app enhalten. am besten man löschs "/Users/fyysh/TMP/PrintAutomation.app" da raus und zieht dann PrintAutomation.app aus dem finder dahin. darauf achten, dass der pfad in " gequoted sein muss und ein posix pfad ist.

storeFolder ist ein ordner deiner wahl. den kannst du auch so aus dem finder reinziehen. dort wird dann der anhang gespeichert werden. auch posix.


dieses script lässt man dann von mail durch eine regel ausführen.

vorsicht: wenn eine solche mail mehrere pdf-anhänge hätte, dann würde es nur das letzte an das andere script übergeben. funktioniert also nur für einen pdf-anhang. mehrere pdfs aus mehreren mails sollten kein problem sein. für mehrere pdf's in einer mail müsste man das ganze nochmal anpassen...

hier ist der code:
Code:
property printAttachmentScript : (POSIX file "/Users/fyysh/TMP/PrintAutomation.app") as alias
property storeFolder : "$HOME/TMP/MailAttachmentStore"

using terms from application "Mail"
	on perform mail action with messages msgs for rule rule
		
		my doStuff(msgs)
		
	end perform mail action with messages
end using terms from

on run
	tell application "Mail" to set msgs to the selection
	my doStuff(msgs)
end run

on doStuff(msgs)
	set storeFolder to (do shell script "echo \"" & storeFolder & "\"")
	do shell script "test -d " & quoted form of storeFolder & " || mkdir -p " & quoted form of storeFolder
	
	
	
	tell application "Mail"
		set storedPDFAttachments to {}
		set selectedMails to the msgs
		repeat with aMail in selectedMails
			set aMailSubject to subject of aMail
			repeat with aAttachment in (mail attachments of aMail)
				set aAttachmentName to name of aAttachment
				if (text -4 thru -1 of aAttachmentName) = ".pdf" then
					set aAttachmentStorePath to (my storeFolder & "/" & aMailSubject & ".pdf") as string
					--try
					tell me to do shell script "rm -f " & quoted form of aAttachmentStorePath
					--end
					save aAttachment in aAttachmentStorePath
					set storedPDFAttachments to storedPDFAttachments & aAttachmentStorePath
				end if
			end repeat
		end repeat
	end tell
	
	
	set filesToPrint to {}
	repeat with aFile in storedPDFAttachments
		set filesToPrint to filesToPrint & {(POSIX file aFile) as alias}
		set filesToPrint to filesToPrint & {(POSIX file aFile) as alias}
	end repeat
	
	my runTheScript(filesToPrint, storedPDFAttachments)
end doStuff


on runTheScript(filesToPrint, storedPDFAttachments)
	--return filesToPrint
	tell me to run script my printAttachmentScript with parameters filesToPrint
	
	--wenn die dataien nach dem drucken gelöscht werden sollen, das folgende unkommentieren
	--repeat with aFile in storedPDFAttachments
	--	do shell script "rm -f " & quoted form of aFile
	--end repeat
end runTheScript


(jaja... das kann man auch schöner... wie gesagt: dahingeschmiert)



so und das andere script ist das eigentlich interessante. das druckt. dabei ist es dem ding egal, ob fax oder drucker. kann beides. es muss nur die richtige printqueue angegeben werden.

es kann übrigens als dropplet, folder action (ungetestet) und im terminal mit parametern verwendet werden. sollte alles klappen.

was es tut: wenn es für normales drucken eingestellt ist, druckt es einfach die übergebenen dateien (wenn mit endung erlaubt, siehe unten), wenn es für faxen eingestellt ist, sendet es die datei an die telefonnummer, die durch den dateinamen übergeben wird.



ich stand mit dem TE in mailkontakt und habe ihm dann folgende erklärung geschickt (vor einer stunde oder so;)):
2. PrintAutomation.app
das ist das eigentliche druckscript.
es ist, zugegebenermaßen, nicht ganz nach deinen "spezifikationen" geschrieben, denn es geht überhaupt nicht über preview. das wollte ich noch einbauen, dass man sich das file wenigstens vorher anschauen kann, bin aber noch nicht dazu gekommen in der kurzen zeit - ich reich's irgendwann nach.


bei PrintAutomation.app kannst du in den ersten zeilen folgendes einstellen

property printQueue : "Fax"
das ist die printqueue deines fax. die bekommst du im queuefenster des faxs heraus, wenn du auf "fax setup" (sry, keine ahnung wie das auf deutsch dann heißt, guck einfach auf den screenshot) klickst. das obere bild sind übrigens die drucker- & fax-einstellungen in den systemeinstellungen.
2010-09-24_0832.png

kopier dir einfach die fax queue von da raus und füge sid im script ein.



property isFax : true
wenn du hier false einstellst, könntest du theoretisch, bei richtig eingestellter print queue, auch direkt auf einen drucker drucken. du willst ja faxen, also lass einfach auf true



property minPhoneNumberLength : 3
anhand dieser angabe entscheidet das script, ob es sich um eine gültige telefonnummer handelt oder nicht. bei "3" würde bspw eine nummer "123" durchgehen, aber auch "+12". hat die aus dem dateinamen ermittelte nummer weniger als 3 stellen, wird es die datei nicht an den fax schicken (an den drucker allerdings schon, falls property isFax : false eingestellt ist).



property previewFile : true und property confirmPrint : true sind zwar schon da, werden aber noch nicht verwendet.



property showResults : true
das script zeigt am schluss einen dialog mit einer zusammenfassung an, was es getan hat. im wesentlichen sagt es dir, welche von den übergebenen dateien es an den drucker/fax geschickt hat und welche nicht. setzt du showResults auf false, wird diese meldung nicht angezeigt.



property allowwdFileTypes : {"pdf"}
hier kannst du eingeben, welche dateitypen gedruckt werden sollen. bei allowwdFileTypes : {"pdf"} wird das script ausschließlich pdf's drucken. wenn du noch txt's drucken wolltest, müsste man allowwdFileTypes : {"pdf"",txt"} einstellen. bei dir geht's aber ja nur um pdfs.



property isDebug : false
das ist für mich zum rumtesten. lass einfach auf false.


da code:
Code:
property printQueue : "Fax" --name der print queue, über die druckereinstellungen einzusehen, in " eingeschlossen
property isFax : true --true||false - wenn gefaxt werden soll, dann true, sonst false. wenn true, dann wird der dateiname zur faxnummer!
property minPhoneNumberLength : 3 --mindestlänge der telefonnummer, es zählen ziffern und das "+", muss mindestens 3 sein!

-- noch nicht drin
property previewFile : true --true||false - wenn das file vorher mit preview angezeigt werden soll, dann true, sonst false. was auch immer zum pdf anzeigen benutzt wird: das wird aufgerufen werden
property confirmPrint : true --true||false - wenn vor dem drucken bestätigt werden soll, dann tue, sonst false
--

property showResults : false --true||false - wenn nach erfolgreichem senden ein dialog angezeigt werden soll, dann true, sonst false

property allowwdFileTypes : {"pdf"} --erlaubte dateitypen, bspw "pdf", "txt"... komma getrennt und in doppelten anführungszeichen

property isDebug : false



on run filesToPrint
	--durch diesen handler kann man ein o. mehrere dateien mit diesem script öffnen, script muss als .app gespeichert sein
	
	if (isDebug) then ¬
		set filesToPrint to {"Perseus-HD:Users:fyysh:TMP:123/346.pdf", "Perseus-HD:Users:fyysh:TMP:482.486.1.pdf", "Perseus-HD:Users:fyysh:TMP:482.486.1a.pdf", "Perseus-HD:Users:fyysh:TMP:12345.pdf", "Perseus-HD:Users:fyysh:TMP:67890 123-45 .pdf", "Perseus-HD:Users:fyysh:TMP:67890 123-45.txt", "Perseus-HD:Users:fyysh:TMP:abcd1.pdf", "Perseus-HD:Users:fyysh:TMP:+102398+92183.pdf"}
	printFiles(filesToPrint)
end run

on open filesToPrint
	--dieser handler macht das script zu einem droplet im dock, script muss als .app gespeichert sein mit der option "stay open"
	printFiles(filesToPrint)
end open

on adding folder items to srcFolder after receiving filesToPrint
	printFiles(filesToPrint)
end adding folder items to

on idle
	--nix
end idle



on printFiles(filesToPrint)
	if (count of filesToPrint) < 1 then
		display alert "Nothing to do" message "Print Queue: " & my printQueue ¬
			as informational ¬
			buttons {"OK"} ¬
			default button 1
		return true
	end if
	
	set printCommands to {} as list
	set excludedFiles to {} as list
	set printedFiles to {} as list
	
	
	repeat with aFile in filesToPrint
		set printThis to false
		set aFile to aFile as alias
		
		tell application "Finder"
			set aFileName to name of aFile
			set aFileHiddenExtension to extension hidden of aFile
			set aFileNameExtension to (name extension of aFile)
		end tell
		
		
		if my allowwdFileTypes does not contain aFileNameExtension then --check if it's an allowed file type
			set printThis to false
		else
			--are we printing a fax?
			if (my isFax) then
				set printOption to getPrintOption(aFileName, aFileHiddenExtension, aFileNameExtension)
				if printOption = false then
					set printThis to false
				else
					set printThis to true
				end if
			else
				set printOption to "" --no fax, so we dont need print options
			end if
		end if
		
		
		if printThis then
			set printCommands to printCommands & {{pQueue:my printQueue, pOption:printOption, pFile:(POSIX path of aFile), showPreview:my previewFile, letConfirm:my confirmPrint}}
			set printedFiles to printedFiles & (POSIX path of aFile) --add it to printedFiles so we can list them later
		else
			set excludedFiles to excludedFiles & {{POSIX path of aFile}} --if not add it to excludedFiles so we can list them later
		end if
		
	end repeat
	
	
	
	if (doPrint(printCommands)) then
		genResults(printedFiles, excludedFiles)
		return true
	else
		return false
	end if
	
end printFiles


to genResults(printedFiles, excludedFiles)
	set asTID to AppleScript's text item delimiters
	set AppleScript's text item delimiters to return
	set printedFiles to (printedFiles as string)
	set excludedFiles to (excludedFiles as string)
	set AppleScript's text item delimiters to asTID
	
	log "Printed:" & return & printedFiles
	log "Excluded:" & return & excludedFiles
	
	
	if (my showResults) then
		display alert "Done printing" message "Print Queue: " & my printQueue & return & return & "Printed files:" & return & printedFiles & return & return & "Excluded files:" & return & excludedFiles ¬
			as informational ¬
			buttons {"OK"} ¬
			default button 1
	end if
end genResults


to getPrintOption(aFileName, aFileHiddenExtension, aFileNameExtension)
	set phoneNumber to aFileName --get phone number from file name
	
	if aFileHiddenExtension = false then ¬
		set phoneNumber to my replaceText(phoneNumber, "." & aFileNameExtension, "") --remove file extension if shown
	
	set phoneNumber to my cleanPhoneNumber(phoneNumber) --clean the phoneNumber	
	if phoneNumber = false then
		return false
	else
		return "-o phone=" & quoted form of phoneNumber --generate the print option
	end if
end getPrintOption


to doPrint(printCommands)
	set pCount to 0
	repeat with aCommand in printCommands
		
		--generate the shell cmd
		set shellCMD to "lp -d" & space ¬
			& (pQueue of aCommand) & space ¬
			& (pOption of aCommand) & space ¬
			& (quoted form of (pFile of aCommand))
		
		log shellCMD
		try
			do shell script shellCMD --run the shell cmd
			set pCount to pCount + 1
		on error e
			display alert ¬
				"Printing Failed" message "Error: " & e & return & return & "Print Queue: " & (pQueue of aCommand) & return & "File: " & (pFile of aCommand) & return & return & ¬
				"Hint: The queue set in variable 'printQueue' probably does not exist!" as warning ¬
				buttons {"Cancel"} ¬
				default button 1
			log "Print Count:" & pCount
			return false
		end try
		
	end repeat
	
	log "Print Count:" & pCount
	return true
end doPrint

on cleanPhoneNumber(phoneNumber)
	set cleanedPhoneNumber to {}
	
	repeat with aChar in phoneNumber
		if "+1234567890" contains aChar then ¬
			set cleanedPhoneNumber to cleanedPhoneNumber & aChar
	end repeat
	
	if my minPhoneNumberLength < 3 then set my minPhoneNumberLength to 3
	if (count of cleanedPhoneNumber) < my minPhoneNumberLength then
		return false
	else if (the offset of "+" in (text 2 thru -1 of (cleanedPhoneNumber as string))) > 0 then
		return false
	else
		return (cleanedPhoneNumber as string)
	end if
	
end cleanPhoneNumber


on replaceText(subject, find, replace)
	set prevTIDs to text item delimiters of AppleScript
	set text item delimiters of AppleScript to find
	set subject to text items of subject
	
	set text item delimiters of AppleScript to replace
	set subject to "" & subject
	set text item delimiters of AppleScript to prevTIDs
	
	return subject
end replaceText


hier sind die beiden scripte:
Anhang anzeigen die_scripts.zip


dabei ist der eigentliche with am ganzen, also das drucken der dateien ohne dafür irgend ein app anzusprechen, habe ich mir übrigens von hier abgeguckt.