python没有正确执行shell命令“mail”

时间:2013-04-13 20:23:55

标签: python linux bash shell email

我使用以下bash代码发送电子邮件:

echo abc | mail -s Subject abc@def.com

工作正常。现在我想在python中使用相同的命令,所以我写下以下内容:

call(["echo abc" "|" "mail", "-s Subject", "abc@def.com"], shell=True)

当我使用

调用python脚本时,此python代码不会向我发送电子邮件
$python email.py

我从shell获得以下信息

No mail for rex

这是怎么发生的?

2 个答案:

答案 0 :(得分:2)

如果您使用的是Python,则不需要echo和命令之间的管道 您可以启动流程并使用communicate方法:

import subprocess

def send_message(recipient, subject, body):
    process = subprocess.Popen(['mail', '-s', subject, recipient],
                               stdin=subprocess.PIPE)
    process.communicate(body)

答案 1 :(得分:1)

在其他地方建议使用subprocess.communicate是一种更好的方法。出于here所述的原因,您应该避免使用shell=True。但是要回答你的问题,为什么你的调用不起作用,问题是你已经将shell字符串分解为相当任意的字符串。如果将整个命令作为一个字符串传递, 至少应该在Unix-y平台上工作。

call(["echo abc|mail -s Subject abc@def.com"], shell=True)

查看详情here。但不推荐这种用法。