2010-01-07 3 views
3

Я EE, пытаясь написать сценарий, чтобы упростить проверку файлов с помощью Python. По какой-то причине наши ИТ-специалисты не позволят мне получить доступ к нашему серверу smtp и разрешат отправлять почту через mailx. Итак, я думал о запуске mailx из Python и отправить его так же, как и в моей консоли. Увы, это дает возможность. См. Журнал Linux ниже:Как отправить почту через 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*** 

Я новичок в Python (теперь переход из PERL). Есть предположения?

ответ

5

вы можете использовать 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() 

Если вы действительно хотите использовать подпроцесс (который я советую против)

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

Вам саз использовать subprocess.call. Как:

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

Подробности here

+0

как я ценю краткость – galets

0

код Лиор Даган был близок к правильной/функциональны: ошибка в таком подходе в вызове subprocess.Popen недостающий shell=Truekwarg. Любой действительно рассматривает этот подход должен быть в курсе, что документация subprocess предупреждает, что:

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

Вообще F0RR-х и решения ghostdog74 должны быть предпочтительными, поскольку они являются более надежными и безопасными.

Смежные вопросы