mailx不适用于子进程

时间:2014-11-27 17:53:14

标签: python subprocess

我可以通过在命令行中手动输入此命令来发送电子邮件:

 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 个答案:

答案 0 :(得分:1)

|字符必须由shell解释,而不是由程序解释。您目前的操作如下所示:

echo "test email" \| mailx -s "test email" someone@somewhere.net

那就是没有shell处理|并将其作为字符串传递给echo。

您有两种方法可以解决这个问题:

  • 明确地使用子进程(echomailx)从python启动2个命令,并将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环境问题(最终执行不需要的命令)