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
,那么您是安全的。
我正在将 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
,那么您是安全的。