Mailx 不会通过 python 发送

问题描述

我正在将一个 shell 脚本重写为 python,其中一部分包括通过 mailx 发送通知。 我似乎无法正确处理子流程。

result = subprocess.run(["/bin/mailx","-r","[email protected]","-s","Test","[email protected]"],check=True)

当我在服务器上运行此命令时,该命令返回一个空行,“无法完成”,我认为这可能是因为 mailx 正在等待电子邮件正文,因为当我尝试通过 bash 发送而没有正文时,我得到了相同的结果问题,所以我得到了这些提示

1. result = subprocess.run(["echo","Testing","|",/bin/mailx",check=True)
2。 result = subprocess.run(["/bin/mailx","[email protected]",b"Testingtesting"],check=True)

测试 1 时,它只是在 echo 之后回显所有内容。 测试 2 时,我再次得到空白行。

解决方法

使用 subprocess.Popen,您可以执行以下操作:

import subprocess
cmd = """
        echo 'Message Body' | mailx -s 'Message Title' -r [email protected] [email protected] 
      """

result = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE)
output,errors = result.communicate()

关于来自documentationshell=True

shell=False 禁用所有基于 shell 的功能,但不受此漏洞的影响;有关使 shell=False 工作的有用提示,请参阅 Popen 构造函数文档中的注释。 在命令字符串是从外部输入构造的情况下,强烈建议不要使用 shell=True

就您而言,如果您不接受用户输入将其传递给 subprocess.Popen,则您是安全的。