You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:13:36