CapiSuite - Augabe als *.tif - cs_helpers.py

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Phunkybeam
User
Beiträge: 7
Registriert: Samstag 31. Januar 2009, 13:44

Hallo liebe Foren Gemeinde,

Weil ich mich mit Python nicht auskenne, und die Gemeinde um die Capisuite leider immer kleiner wird, möchte ich euch um Hilfestellung bitten. Habe bereits mehrer Tage gegoogelt aber nichts verwertbares gefunden :(

Vorweg:

Capisuite ist ein Programm unter Linux, es ermöglicht das senden und empfangen von Faxen sowie die Einrichtung eines Anrufbeantworters, die Anwendung ist Multi-User fähig.
Entgegengenommene Faxe und Anrufbeantworter Nachrichten verschickt das Programm auf Wunsch per E-Mail.
Dieses klappt soweit auch richtig super...

Problem:

Standardmäßig konvertiert die Capisuite von *.sff -> *.tif -> *.ps -> *.pdf (Die Anweisung zur Konvertierung wird durch die Datei "cs_helpers.py" gegeben.) Somit wird das Fax also als PDF Datei übermittelt, für meine weitere Verwendung würde mir eine TIF Datei gelegener kommen.

Heist ich würde den Konvertierungsvorgang gerne nach dem die TIF Datei erstellt wurde, unterbrechen, und die E-Mail senden

Die entschiedenen Code Zeilen dürfen die Zeilen 168 bis 204 sein:

Code: Alles auswählen

def sendMIMEMail(mail_from,mail_to,mail_subject,mail_type,text,attachment):
	import email.MIMEBase,email.MIMEText,email.MIMEAudio,email.Encoders,encodings.ascii,smtplib,popen2,capisuite
	msg = email.MIMEBase.MIMEBase("multipart","mixed")
	msg['Subject']=mail_subject
	msg['From']=mail_from
	msg['To']=mail_to
	msg['Date']=time.strftime('%a, %d %b %Y %H:%M:%S %z')

	msg.preamble = 'This is a Multipart-MIME-message. Please use a capable mailer.\n'
	msg.epilogue = '' # To guarantee the message ends with a newline

	basename=attachment[:attachment.rindex('.')+1]
	try:
		if (mail_type=="sff"): # normal fax file
			# sff -> tif
			ret=sfftotiff(attachment,basename+"tif")
			if (ret or not os.access(basename+"tif",os.F_OK)):
				raise "conv-error","Can't convert sff to tif. sfftobmp not installed?"
			# tif -> ps -> pdf
			# the first pipe must be handled by the shell so that the output of
			# of ps2pdf can be read immediately. Handling this shell in Python
			# leads to an overflow of the ps2pdf output pipe...
			command="tiff2ps -h11 -H12 -L.5 -w8.5 -a "+escape(basename+"tif")+" | ps2pdf -sPAPERSIZE=a4 - -"
			tiff2pdf=popen2.Popen3(command)
			if (tiff2pdf.poll()!=-1):
				raise "conv-error","Error while calling tiff2ps or ps2pdf. Not installed?"
			tiff2pdf.tochild.close() # we don't need the input pipe
			# create attachment with pdf stream
			filepart = email.MIMEBase.MIMEBase("application","pdf",name=os.path.basename(basename)+"pdf")
			filepart.add_header('Content-Disposition','attachment',filename=os.path.basename(basename)+"pdf")
			filepart.set_payload(tiff2pdf.fromchild.read())
			tiff2pdf.fromchild.close()
			ret=tiff2pdf.wait()
			if (ret!=0):
				raise "conv-error","Error "+str(ret)+" occured during tiff2ps or ps2pdf"
			os.unlink(basename+"tif")
			email.Encoders.encode_base64(filepart)
Wäre klasse wenn mir hier jemand Hilfestellung geben könnte :) Vielen Dank schon mal im Voraus!

Gruß Phunkybeam
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Hallo,
versuch es mal damit:

Code: Alles auswählen

    try:
        if (mail_type=="sff"): # normal fax file
            # sff -> tif
            ret=sfftotiff(attachment,basename+"tif")
            if (ret or not os.access(basename+"tif",os.F_OK)):
                raise "conv-error","Can't convert sff to tif. sfftobmp not installed?"
            filepart = email.MIMEBase.MIMEBase("image","tif",name=os.path.basename(basename)+"tif")
            filepart.add_header('Content-Disposition','attachment',filename=os.path.basename(basename)+"tif")
            filepart.set_payload(tiff2pdf.fromchild.read())
            email.Encoders.encode_base64(filepart)
        elif (mail_type=="cff"): # color fax file
Edit, wird nicht funktionieren, da ich nicht weiß, was

Code: Alles auswählen

filepart.set_payload(tiff2pdf.fromchild.read())
tut. Dieser Code ist DERMASSEN grauenhaft... O__o
Phunkybeam
User
Beiträge: 7
Registriert: Samstag 31. Januar 2009, 13:44

Hi Dauerbaustelle,

Habe das jetzt mal testeshalber durch den Python durchlaufen lassen, und
der Interpreter gibgt mir folgende Meldung zurück:

File "cs_helpers.py", line 187
filepart.add_header('Content-Disposition','attachment',filename=os.path.basename(basename)+"tif")
^
IndentationError: unindent does not match any outer indentation level

???
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Bei Python muss der Programmierer (anders als bei anderen Sprachen) auf die Einrückung achten. Übersetze die Fehlermeldung ins Deutsche, dann weißt du, was du falsch gemacht hast.
Phunkybeam
User
Beiträge: 7
Registriert: Samstag 31. Januar 2009, 13:44

So das Problem habe ich nun dann also hinbekommen, das Skript läuft also durch.

Code: Alles auswählen

    try:
        if (mail_type=="sff"): # normal fax file
            # sff -> tif
            ret=sfftotiff(attachment,basename+"tif")
            if (ret or not os.access(basename+"tif",os.F_OK)):
                raise "conv-error","Can't convert sff to tif. sfftobmp not installed?"
            filepart = email.MIMEBase.MIMEBase("image","tif",name=os.path.basename(basename)+"tif")
            filepart.add_header('Content-Disposition','attachment',filename=os.path.basename(basename)+"tif")
            #filepart.set_payload(tiff2pdf.fromchild.read())
            email.Encoders.encode_base64(filepart)
        elif (mail_type=="cff"): # color fax file 
Die Zeie:

Code: Alles auswählen

filepart.set_payload(tiff2pdf.fromchild.read())
habe ich erstmal auskomentiert, und eine Test druchgeführt, ergebnis Dateiname ist richtig und die Datei möchte auch als *.tif Datei im E-Mail Fach ankommen, aber leider ist die Datei 0Kb groß und hat dem zu folge keinen Inhalt ;(

Kann es also sein das die Aufgabe der Zeile ist, den Inhalt in die Datei zu schreiben ?

Doof gedacht habe ich ohne jegliche kenntnis dann die Zeile umgestellt in:

Code: Alles auswählen

filepart.set_payload(sfftotiff.fromchild.read())
Hierauf gibt mir das LOG der Capisuite dann folgendes zurück:
Mon Feb 2 22:54:43 2009 Pythonscript /usr/lib/capisuite/incoming.py,callIncoming,0x82d7ed0: A python error occured. See traceback below.
Mon Feb 2 22:54:43 2009 Pythonscript 0x82d7ed0: Python traceback: Traceback (most recent call last):
Mon Feb 2 22:54:43 2009 Pythonscript 0x82d7ed0: Traceback: File "/usr/lib/capisuite/incoming.py", line 76, in callIncoming
Mon Feb 2 22:54:43 2009 Pythonscript 0x82d7ed0: Traceback: faxIncoming(call,call_from,call_to,curr_user,config,0)
Mon Feb 2 22:54:43 2009 Pythonscript 0x82d7ed0: Traceback: File "/usr/lib/capisuite/incoming.py", line 157, in faxIncoming
Mon Feb 2 22:54:43 2009 Pythonscript 0x82d7ed0: Traceback: +"Datei befindet sich im Anhang.\nDie Originaldatei liegt in "+filename+"\n\n", filename)
Mon Feb 2 22:54:43 2009 Pythonscript 0x82d7ed0: Traceback: File "/usr/lib/python2.5/site-packages/cs_helpers.py", line 198, in sendMIMEMail
Mon Feb 2 22:54:43 2009 Pythonscript 0x82d7ed0: Traceback: filepart.set_payload(sfftotiff.fromchild.read())
Mon Feb 2 22:54:43 2009 Pythonscript 0x82d7ed0: Traceback: AttributeError: 'function' object has no attribute 'fromchild'
Resultat nun also, es wird auch keine E-Mail mehr versendet :?
Phunkybeam
User
Beiträge: 7
Registriert: Samstag 31. Januar 2009, 13:44

So und wieder um eine Erkenntnis reicher, wird das Skript wie folgt ausgeführt:

Code: Alles auswählen

    try:
        if (mail_type=="sff"): # normal fax file
            # sff -> tif
            ret=sfftotiff(attachment,basename+"tif")
            if (ret or not os.access(basename+"tif",os.F_OK)):
                raise "conv-error","Can't convert sff to tif. sfftobmp not installed?"
            filepart = email.MIMEBase.MIMEBase("image","tif",name=os.path.basename(basename)+"tif")
            filepart.add_header('Content-Disposition','attachment',filename=os.path.basename(basename)+"tif")
            #filepart.set_payload(tiff2pdf.fromchild.read())
            email.Encoders.encode_base64(filepart)
        elif (mail_type=="cff"): # color fax file
Dann wird die *.tif Datei auch richtig im verzeichnis: /var/spool/capisuite/users/username/recieved
abgelegt, und zwar komplett mit Inhalt, aber halt an die E-Mail wird es nicht richtig angehängt ... :?

Also mir scheint es so, das *pdf wird irgendwo tempörär gespeichter, denn im normalfall wurde dieses nicht in dem Verzeichnis abgelegt, das *tif file hingeng wird nun zusätzlich zum *.sff file in dem Verzeichnis abgelegt.

Sieht wohl ganz danach aus als wäre hier etwas am Pfad zu verändern...

Dafür noch jemand eine idee !???



Danke schon mal an alle!!! *super!!!!!*

Code: Alles auswählen

def sfftotiff(fromfile,tofile):
	# for sfftobmp 2.x: remove the "#2" characters of the following line
	#2 parameters=("-tif",fromfile,tofile)
	# for sfftobmp 3.x: remove the "#3" characters of the following line
	parameters=("-tif",fromfile,"-o",tofile)	
	return os.spawnlp(os.P_WAIT,"sfftobmp","sfftobmp",*parameters)
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

Phunkybeam hat geschrieben:So und wieder um eine Erkenntnis reicher, wird das Skript wie folgt ausgeführt:
...
Also mir scheint es so, das *pdf wird irgendwo tempörär gespeichter, denn im normalfall wurde dieses nicht in dem Verzeichnis abgelegt, das *tif file hingeng wird nun zusätzlich zum *.sff file in dem Verzeichnis abgelegt.
So wird kein PDF erzeugt, da die nötigen Aufrufe fehlen.
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Hi

wie wärs damit?
set_payload setzt die Daten von der Datei, ist also zwingend notwendig.

Code: Alles auswählen

    try:
        if (mail_type=="sff"): # normal fax file
            # sff -> tif
            ret=sfftotiff(attachment,basename+"tif")
            if (ret or not os.access(basename+"tif",os.F_OK)):
                raise "conv-error","Can't convert sff to tif. sfftobmp not installed?"
            filepart = email.MIMEBase.MIMEBase("image","tif",name=os.path.basename(basename)+"tif")
            filepart.add_header('Content-Disposition','attachment',filename=os.path.basename(basename)+"tif")
            f = open(basename+"tif", 'rb')
            filepart.set_payload(f.read())
            f.close()
            email.Encoders.encode_base64(filepart)
        elif (mail_type=="cff"): # color fax file
Phunkybeam
User
Beiträge: 7
Registriert: Samstag 31. Januar 2009, 13:44

mkallas hat geschrieben:
Phunkybeam hat geschrieben:So und wieder um eine Erkenntnis reicher, wird das Skript wie folgt ausgeführt:
...
Also mir scheint es so, das *pdf wird irgendwo tempörär gespeichter, denn im normalfall wurde dieses nicht in dem Verzeichnis abgelegt, das *tif file hingeng wird nun zusätzlich zum *.sff file in dem Verzeichnis abgelegt.
So wird kein PDF erzeugt, da die nötigen Aufrufe fehlen.
Sinn und Zweck dieses Threads ist es ja eben, zu der Ausgangssituation zu kommen eine *.tif oder wahlweise eine *.sff Datei zu senden statt wie im Standard bereits festgelegt die *.pdf Datei.

Nur leider wird die Datei bis dato nicht richtig angehängt, obwohl das File im User/recieved Verzeichnis komplett vorliegt.

Gruß
Phunkybeam
Phunkybeam
User
Beiträge: 7
Registriert: Samstag 31. Januar 2009, 13:44

Hallo Rayo,

vielen Dank erst einmal für deinen konstruktiven Beitrag, ich habe das nun mal zur Probe laufen lassen, aber egal wie ich deine Zeilen ausrichte erhalte ich die typische Fehlermeldung...
IndentationError: unindent does not match any outer indentation level
root@telegraf:~# python2.5 cs_helpers.py
File "cs_helpers.py", line 198
f=open(basename+"tif", 'rb' )
^
(Der Pfeil wird auf die End klammer gerichtet...)
Ich meine da ich mich mit Python auch nicht auskenne, kenne ich die Regeln dazu auch nicht, klärt mich auf ...

lg
Phunkybeam
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Hi

Bei Python kommt es auf die Einrückungstiefe an, zu welchem Block es ghört. Es sollte also auf gleicher Höhe wie filepart.add_header... sein, und achte darauf, dass nicht Leerschläge und Tabs gemischt sind.

Gruss
Phunkybeam
User
Beiträge: 7
Registriert: Samstag 31. Januar 2009, 13:44

Hallo @ all,

Vielen Dank erstmal an alle mitwirkenden, ein besonderer dank an "Rayo", du bist der Mann des Tages für mich!

Funktioniert 1A, die Faxe kommen nun als *.tif Datei an.
mpathy
User
Beiträge: 48
Registriert: Montag 17. September 2007, 12:29

Kann man mit dieser Library Faxe versenden, und deren Status abfragen etc.? Sowas benötige ich nämlich dringend!

Ich finde null Info zum Thema Faxen per Python nativ, per Libary oder einen geeigneten Wrapper für z.B. Hylafax
Antworten