2014-11-27 3 views
0

Я могу отправить электронную почту, введя эту команду вручную в командной строке:mailx не работает с подпроцесса

echo "test email" | mailx -s "test email" [email protected] 

я получаю электронную почту в своем почтовом ящике, работает.

Он не работает с подпроцессом, хотя:

import subprocess 
recipients = ['[email protected]'] 
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" [email protected] 

То есть не процесс оболочки | и передать его в виде строки в эхо.

Есть два способа исправить это:

  • явно начинаются 2 команды из Python с подпроцесс (echo и mailx) и трубы на выходе из echo на вход mailx
  • использование shell=True параметра в подпроцесс

Второе решение проще и приведет:

import subprocess 
recipients = '[email protected]' 
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 проблем окружающей среды, которые могут привести к проблемам безопасности (Вы заканчиваете в выполнении нежелательных команд)

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