Mailx 不会通过 python 发送

Mailx won't send through python

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

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

当我在服务器上 运行 命令 returns 一个空白行时,“不会完成”,我认为这可能是因为 mailx 正在等待电子邮件 body 因为当我尝试通过 bash 发送而没有 body 我遇到了同样的问题,所以我得到了这些提示:

1。 result = subprocess.run(["echo", "Testing", "|", /bin/mailx", "-r", "sender@email.com", "-s", "Test", "recipient@email.com"], check=True)
2。 result = subprocess.run(["/bin/mailx", "-r", "sender@email.com", "-s", "Test", "recipient@email.com", b"Testingtesting"], check=True)

当测试 1 时,它只是在 echo 之后回显所有内容。 测试2时,又出现空白行

使用 subprocess.Popen 你可以按如下方式进行:

import subprocess
cmd = """
        echo 'Message Body' | mailx -s 'Message Title' -r sender@someone.com receiver@example.com 
      """

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

关于 shell=True 来自 documentation

shell=False disables all shell based features, but does not suffer from this vulnerability; see the Note in the Popen constructor documentation for helpful hints in getting shell=False to work. The use of shell=True is strongly discouraged in cases where the command string is constructed from external input

在您的情况下,如果您不将用户输入传递给 subprocess.Popen,那么您是安全的。