mailx не работает с подпроцессом
Я могу отправить электронное письмо, набрав эту команду вручную в командной строке:
echo "test email" | mailx -s "test email" someone@somewhere.net
Я получаю письмо в свой почтовый ящик, работает.
Это не работает с подпроцессом, хотя:
import subprocess
recipients = ['someone@somewhere.net']
args = [
'echo', '"%s"' % 'test email', '|',
'mailx',
'-s', '"%s"' % 'test email',
] + recipients
LOG.info(' '.join(args))
subprocess.Popen(args=args, stdout=subprocess.PIPE).communicate()[0]
Нет ошибок, но я никогда не получаю письмо в своем почтовом ящике.
Есть идеи?
1 ответ
Решение
|
Символ должен интерпретироваться оболочкой, а не программой. То, что вы сейчас делаете, выглядит как следующая команда:
echo "test email" \| mailx -s "test email" someone@somewhere.net
То есть не обработать оболочку |
и передать его как строку для эха.
У вас есть два способа это исправить:
- явно запустить 2 команды из Python с подпроцессом (
echo
а такжеmailx
) и передать вывод изecho
на входmailx
- использование
shell=True
параметр в подпроцессе
Второе решение проще и приведет к:
import subprocess
recipients = 'someone@somewhere.net'
cmd = ('echo "%s" | mailx -s "%s"' % ('test email', 'test email')) + recipients
LOG.info(cmd)
subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True).communicate()[0]
Но вы должны использовать полный путь в командах, чтобы избежать PATH
проблемы среды, которые могут привести к проблемам безопасности (вы заканчиваете в выполнении нежелательных команд)