2010-01-07 2 views
3

Je suis EE, en essayant d'écrire un script pour simplifier les vérifications de fichiers en utilisant Python. Pour une raison quelconque, notre service informatique ne me laisse pas accéder à notre serveur smtp, et permettra seulement l'envoi de courrier via mailx. J'ai donc pensé à lancer mailx à partir de Python et à l'envoyer, de la même manière que cela fonctionne dans ma console. Hélas, cela donne une exeption. Voir le journal Linux ci-dessous:Comment envoyer un mail via mailx & subprcoess?

***/depot/Python-3.1.1/bin/python3.1 
Python 3.1.1 (r311:74480, Dec 8 2009, 22:48:08) 
[GCC 3.3.3 (SuSE Linux)] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import subprocess 
>>> process=subprocess.Popen('echo "This is a test\nHave a loook see\n" | mailx -s "Test Python" [email protected]') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/depot/Python-3.1.1/lib/python3.1/subprocess.py", line 646, in __init__ 
    errread, errwrite) 
    File "/depot/Python-3.1.1/lib/python3.1/subprocess.py", line 1146, in _execute_child 
    raise child_exception*** 

Je suis un newbe à Python (migrant maintenant à partir de PERL). Des pensées?

Répondre

5

vous pouvez utiliser smtplib

import smtplib 
# email options 
SERVER = "localhost" 
FROM = "[email protected]" 
TO = ["root"] 
SUBJECT = "Alert!" 
TEXT = "This message was sent with Python's smtplib." 


message = """\ 
From: %s 
To: %s 
Subject: %s 

%s 
""" % (FROM, ", ".join(TO), SUBJECT, TEXT) 

server = smtplib.SMTP(SERVER) 
server.set_debuglevel(3) 
server.sendmail(FROM, TO, message) 
server.quit() 

Si vous voulez vraiment utiliser le sous-processus (que je conseille contre)

import subprocess 
import sys 
cmd="""echo "test" | mailx -s 'test!' root""" 
p=subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE) 
output, errors = p.communicate() 
print errors,output 
2

Vous utilisez subprocess.call CAS. Comme:

subprocess.call(["mailx", "-s", "\"Test Python\"", "[email protected]"]) 

Détails here

+0

comment j'apprécie la brièveté – galets

0

Code de Lior Dagan était proche d'être correcte/fonctionnelle: l'erreur dans cette approche est un manque shell=Truekwarg dans l'appel à subprocess.Popen. Toute personne qui envisage effectivement cette approche doit être conscient que la documentation subprocess avertit que:

Invoking the system shell with shell=True can be a security hazard if combined with untrusted input. 

En général devrait être préféré de F0RR et les solutions de ghostdog74 car ils sont plus robustes et sécurisés.

Questions connexes