Shell与subprocess.call发送邮件结果不一致问题求助
嘿,我明白你遇到的问题啦!你的Python代码没正确复刻Shell脚本里的管道逻辑,导致mailx根本没收到邮件正文,所以只有主题传过去了。
问题出在哪?
你看,Shell脚本里是用echo "$msg"把正文输出到管道,再传给mailx;但你的Python代码直接把msg和管道命令拼在了一起,相当于让Shell执行body of the mail | mailx -s 'ERROR:' udhai——可body of the mail根本不是一个合法的Shell命令啊!这个“命令”执行失败后,mailx的标准输入是空的,自然就只有主题没正文了。
两种解决办法,任你选:
办法1:把echo命令也放进Shell字符串里(简单直接)
直接把Shell脚本里的完整命令搬到Python里,这样就能正确通过echo输出正文再管道给mailx:
import subprocess msg = "body of the mail" subprocess.call(f"echo '{msg}' | mailx -s 'ERROR:' udhai", shell=True)
⚠️ 小提醒:如果你的msg里包含单引号或者$这类Shell特殊字符,可能会出问题,这时候要么转义,要么用下面更安全的方法。
办法2:不用Shell管道,通过stdin传正文(更安全推荐)
subprocess其实支持直接给子进程传标准输入,不用依赖Shell,还能避免Shell注入风险,特殊字符也不用额外处理:
import subprocess msg = "body of the mail" subprocess.call( ["mailx", "-s", "ERROR:", "udhai"], input=msg.encode('utf-8') )
这里我们用列表形式传命令参数(这是subprocess官方推荐的写法),然后通过input参数把正文编码后传给mailx的标准输入,这样mailx就能完美接收正文啦。
试一下上面任意一种方法,udhai账号应该就能收到和Shell脚本一样的、带主题和正文的邮件了~
内容的提问来源于stack exchange,提问作者sabarish s
相关产品推荐
相关产品推荐

