通过在命令行中手动键入此命令,我可以发送电子邮件:
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]没有错误,但我从来没有收到电子邮件在我的收件箱。
有什么想法吗?
发布于 2014-11-27 18:33:04
|字符必须由shell来解释,而不是由程序解释。您当前所做的操作如下所示:
echo "test email" \| mailx -s "test email" someone@somewhere.net也就是说,不要让shell处理|并将其作为字符串传递回送。
有两种方法可以解决这个问题:
echo和mailx)从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环境问题(以执行不需要的命令结束)。
https://stackoverflow.com/questions/27176531
复制相似问题