Seite 1 von 1

PYTHON CGI WRAPPER

Verfasst: Dienstag 4. August 2009, 12:21
von pooner
Hi Leute,

ich bräuchte mal euren Rat. Ich habe mir ein kleines Python Skript gebaut welches Information aus einer Datenbank holt und mir diese dann per Mail zustellt. Das funktioniert soweit auch ganz gut. Da ich aber auch anderen erlauben wollte dies zu nutzen habe ich mit cgi ein Formular gebaut, welches anhand der übergebenen Parameter mein Skript aufruft. Leider kriege ich immer Probleme beim versenden der Mail (nutze im Skript mutt, aufgerufen als Systembefehl). Liegt soweit ich herausgefunden habe an den Rechten, daher meine Frage nach einem Wrapper-skript, wleches mir die Möglichkeit eröffnet das Skript als anderer Benutzer auszuführen.

Oder habt Ihr eine bessere Idee? :?:

Verfasst: Dienstag 4. August 2009, 15:46
von Hyperion
Vielleicht würde uns der Quellcode und die Fehlermeldung weiterhelfen ...

Ansonsten könntest Du es mal mit Gerolds SimpleMail-Script versuchen.

Verfasst: Dienstag 4. August 2009, 19:23
von Leonidas
Ausführung als anderer User: suchst du vielleicht suEXEC?

GELÖST: Danke

Verfasst: Mittwoch 5. August 2009, 08:39
von pooner
Danke, simplemail ist vollkommen ausreichend für diesen Anwendungszweck.

Eine Frage noch, Wie kann ich das Modul global in python registrieren?

Verfasst: Mittwoch 5. August 2009, 08:51
von lutz.horn
Wenn Du Python >= 2.6 verwendest, kannst Du PEP 370 "Per user site-packages directory" verwenden. Unter Un*x würdest Du z. B. simplemail in

Code: Alles auswählen

~/.local/lib/python2.6/site-packages
ablegen.

brauche doch nochmal Hilfe

Verfasst: Mittwoch 5. August 2009, 13:16
von pooner
habe jetzt mein Programm umgeschrieben und es funktioniert soweit auch.
Lasse mir mit simplemail die Datei (csv) zusenden, jedoch sind die Daten nicht korrekt. Schaue ich mir die Datei auf der Konsole an muss ich feststellen das Zeilen fehlen. Nutze ich z.B. mutt ist alles korrekt.

hat einer vielleicht eine Idee dazu:

Hier ist meine Funktion zum versenden:

Code: Alles auswählen

def send_CSV(text, csvFile, recipient):
   
   email = Email()
   # Absender
   email.from_address = "root@webserver.de"
   email.from_caption = "webserver"

   # Empfaenger
   email.recipients.add(recipient, recipient[len(recipient)-15])
   # Betreff
   email.subject = "Inventar"
   # Nachricht
   email.message = text
   # Anhaenge
   email.attachments.add_filename(csvFile)
   # Senden
   if email.send():
    print "Nachricht gesendet."
   else:
    print "Die Nachricht wurde nicht versendet." 
    
   print csvFile
Die Datei liegt im /tmp Verzeichnis. Ich bin sehr irritiert und habe grade keien Idee was schieflaufen kann.

Verfasst: Mittwoch 5. August 2009, 14:22
von lutz.horn
Kannst Du bitte die zu verschickenden CSV-Datei posten und zusätzlich die verschickte E-Mail in ihrer rohen Form?

Verfasst: Mittwoch 5. August 2009, 14:32
von pooner
Hi,
erstmal danke für deine Hilfe.

Leider kann ich die CSV nicht verschicken, da sie sensible Daten enthält, die im Unternehmen bleiben sollten.

Hier sind jedoch erstmal die Funktionen zur Generierung der CSV:

Code: Alles auswählen

#
def start_CSV(str_name):
#
 """ Funktion start_CSV:  definiert globale Variablen und gibt csv-File-Handler """
 global csvFile
 csvFile = "/tmp/%s.csv" %str_name
 global writer  # definiert die Variable global, fuer die Verwendung in Fkt.write_CSV
 try:
     writer = csv.writer(open(csvFile, "wb"), delimiter=";")

 except csv.Error, e:
    sys.exit('file %s: %s' % (csvFile, e))




#
def write_CSV(results, location):
 rowresults=[]
 for i in results:
     p = re.compile('[0-9]{9,}')
     m = p.match(i)
     if m:
        # schreibt die CI-Nummer  
        rowresults.append(i) 
       # print ('match found: ', m.group())
     else:
         rowresults.append(i)
 rowresults.append(location)       
 writer.writerow(rowresults)

         

def send_CSV(text, csvFile, recipient):
   
   email = Email()
   # Absender
   email.from_address = "root@server.de"
   email.from_caption = "server"

   # Empfaenger
   email.recipients.add(recipient, recipient[len(recipient)-15])
   # Betreff
   email.subject = "Inventar"
   # Nachricht
   email.message = text
   # Anhaenge
   email.attachments.add_filename(csvFile)
   # Senden
   if email.send():
    print "Nachricht gesendet."
   else:
    print "Die Nachricht wurde nicht versendet." 
Die Version von simplemail.py erscheint mir auch ziemlich alt zu sein, Created: 2004-10-06 Gerold - http://gerold.bcom.at/.

Vielleicht liegt es daran?

Stehe leider ein bissel auf dem Schlauch wie ich die verschickte E-Mail in roher Form bereitstelle.

Verfasst: Mittwoch 5. August 2009, 14:41
von lutz.horn
Dein Code sieht etwas komische aus. Die Einrückungen sind nicht gleichmäßig, gibt es damit keine Fehler vom Python-Interpreter?

Für die Erzeugung von CSV-Dateien gibt es übrigens in der Standard-Bibliothek das Modul http://docs.python.org/library/csv.html

Zum Testen reicht auch eine simple Datei, z. B. als /tmp/foo.csv:

Code: Alles auswählen

1,foo
2,bar
3,baz
Dann funktioniert das hier:

Code: Alles auswählen

from simplemail import Email
email = Email()
email.from_address = "ich@example.com"
email.recipients.add("du@example.com")
email.smpt_server = "smtp.example.com"
email.subject = "GET RICH NOW!!!!1!"
email.message = "see subject"
email.attachments.add_filename("/tmp/foo.csv")
email.send()
In mutt kannst Du die rohe E-Mail durch Drücken von 'h' anzeigen.

Verfasst: Mittwoch 5. August 2009, 15:01
von pooner
danke für die schnelle Reaktion.

Einrückungsprobleme habe ich nicht, es wird kein Fehler ausgegeben.

Wie ich mutt dazu bringe die Rohdaten bei sowas hier auszugeben kriege ich noch raus.
Mein befehl war immer wie folgt :

Code: Alles auswählen

os.system("echo test| mutt  -s %s -a /tmp/test.csv ich@domäne.de", % subject)
Dein Beispiel funktioniert, wie meine Lösung ja auch. Ich werde mirt wohl mal die Standard-Bibliothek anschauen. Die Datei ist aber trotz allem richtig aufgebaut, da Sie beim versenden durch z.B. Mutt korrekt ist, nur durch simplemail halt nicht ???

Verfasst: Mittwoch 5. August 2009, 16:14
von Hyperion
Wird denn die Datei auf dem Server korrekt erstellt? Evtl. tritt der Fehler ja eben schon dabei auf ...

Statt os.system zu nutzen, solltest Du auf das subprocess-Modul umsteigen.

Verfasst: Donnerstag 13. August 2009, 09:20
von pooner
Ich glaube ich habe den Fehler gefunden. Das Problem ist dei Erstellung der CSV-Datei und nicht der Mail-Versand.

Daher möchte ich diesen Post schließen und einen neuen aufmachen.

Danke für eure Hilfe