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 проблемы среды, которые могут привести к проблемам безопасности (вы заканчиваете в выполнении нежелательных команд)

Другие вопросы по тегам