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
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:
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