PYTHON CGI WRAPPER

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
pooner
User
Beiträge: 37
Registriert: Montag 15. Mai 2006, 08:04

Dienstag 4. August 2009, 12:21

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? :?:
Benutzeravatar
Hyperion
Moderator
Beiträge: 7472
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Dienstag 4. August 2009, 15:46

Vielleicht würde uns der Quellcode und die Fehlermeldung weiterhelfen ...

Ansonsten könntest Du es mal mit Gerolds SimpleMail-Script versuchen.
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Dienstag 4. August 2009, 19:23

Ausführung als anderer User: suchst du vielleicht suEXEC?
My god, it's full of CARs! | Leonidasvoice vs Modvoice
pooner
User
Beiträge: 37
Registriert: Montag 15. Mai 2006, 08:04

Mittwoch 5. August 2009, 08:39

Danke, simplemail ist vollkommen ausreichend für diesen Anwendungszweck.

Eine Frage noch, Wie kann ich das Modul global in python registrieren?
Benutzeravatar
lutz.horn
User
Beiträge: 205
Registriert: Dienstag 8. November 2005, 12:57
Wohnort: Pforzheim

Mittwoch 5. August 2009, 08:51

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.
https://www.xing.com/go/invite/18513630.6a91d4
pooner
User
Beiträge: 37
Registriert: Montag 15. Mai 2006, 08:04

Mittwoch 5. August 2009, 13:16

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.
Benutzeravatar
lutz.horn
User
Beiträge: 205
Registriert: Dienstag 8. November 2005, 12:57
Wohnort: Pforzheim

Mittwoch 5. August 2009, 14:22

Kannst Du bitte die zu verschickenden CSV-Datei posten und zusätzlich die verschickte E-Mail in ihrer rohen Form?
https://www.xing.com/go/invite/18513630.6a91d4
pooner
User
Beiträge: 37
Registriert: Montag 15. Mai 2006, 08:04

Mittwoch 5. August 2009, 14:32

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.
Benutzeravatar
lutz.horn
User
Beiträge: 205
Registriert: Dienstag 8. November 2005, 12:57
Wohnort: Pforzheim

Mittwoch 5. August 2009, 14:41

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.
https://www.xing.com/go/invite/18513630.6a91d4
pooner
User
Beiträge: 37
Registriert: Montag 15. Mai 2006, 08:04

Mittwoch 5. August 2009, 15:01

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 ???
Benutzeravatar
Hyperion
Moderator
Beiträge: 7472
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Mittwoch 5. August 2009, 16:14

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.
pooner
User
Beiträge: 37
Registriert: Montag 15. Mai 2006, 08:04

Donnerstag 13. August 2009, 09:20

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
Antworten