Java调用Linux mail命令时主题空格后内容被截断问题排查
解决Java调用Linux mail命令主题被截断的问题
这个坑我之前踩过好几次!核心原因是Java的Runtime.getRuntime().exec()处理命令参数的逻辑和Linux Shell不一样:
当你在SSH里直接执行mail -s "This is a test subject" "receiver@example.com"时,Shell会把引号包裹的内容识别成一个完整的参数;但如果直接把这条命令作为字符串传给exec(),Java会粗暴地按空格拆分所有内容,结果-s的参数变成了"This,剩下的is、a等被当成了额外的无关参数,自然主题就只剩第一个单词了。
下面给你几个亲测有效的解决方案:
方案1:用字符串数组传递参数
把每个命令参数单独拆出来放到数组里,让Java明确知道每个参数的边界,完全避免拆分错误:
String[] mailCmd = { "mail", "-s", "This is a test subject", // 这里直接写带空格的完整主题,不需要加引号 "receiver@example.com" }; Runtime.getRuntime().exec(mailCmd);
这种方式最直接,也不容易出错,是优先推荐的方法。
方案2:通过Shell解析完整命令
如果你习惯写完整的命令字符串,可以让bash帮你解析整个命令(相当于模拟SSH里的执行环境),注意要转义Java字符串里的双引号:
String cmd = "bash -c 'mail -s \"This is a test subject\" \"receiver@example.com\"'"; Runtime.getRuntime().exec(cmd);
这里用bash -c告诉系统调用Shell来执行后面的命令,Shell会正确识别引号里的完整主题。
方案3:更靠谱的替代方案——使用JavaMail API
其实直接调用系统命令不是最佳实践,它依赖Linux服务器的mail配置,还容易出现参数解析、权限等问题。更稳定跨平台的方式是用JavaMail API直接发送邮件,不需要依赖系统命令,还能轻松处理附件、HTML内容等复杂需求,建议长期项目优先考虑这种方式。
内容的提问来源于stack exchange,提问作者MNH
相关产品推荐
相关产品推荐

