Как мне отправить письмо через mailx & subprcoess? - PullRequest
4 голосов
/ 07 января 2010

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

***/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" mymail@mycomopany.com')
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). Есть мысли?

Ответы [ 3 ]

6 голосов
/ 07 января 2010

вы можете использовать smtplib

import smtplib
# email options
SERVER = "localhost"
FROM = "root@example.com"
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 голосов
/ 07 января 2010

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

subprocess.call(["mailx", "-s", "\"Test Python\"", "mymail@mycomopany.com"])

Подробности здесь

0 голосов
/ 18 ноября 2016

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

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

Обычно решения F0RR и ghostdog74 следует отдавать предпочтение, поскольку они более надежны и безопасны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...