使用Java ProcessBuilder调用sSMTP发送邮件失败问题求助
解决Java ProcessBuilder调用sSMTP无法发送邮件的问题
嘿,我刚好碰到过一模一样的问题!命令行里的 < 是shell负责处理的输入重定向语法,但当你用ProcessBuilder直接调用ssmtp时,它并不会自动解析这个符号——< msg.txt会被当成ssmtp的命令行参数,而不是让程序读取文件内容作为输入,这就是为什么命令行能用但Java代码不行的原因。
正确的实现方法:手动写入输入流
我们需要自己读取msg.txt的内容,然后把它写入到ssmtp进程的标准输入流里,具体代码如下:
import java.io.*; public class SSMTPMailSender { public static void main(String[] args) { String recipient = "email@gmail.com"; File messageFile = new File("msg.txt"); try { // 初始化ProcessBuilder,指定ssmtp和收件人参数 ProcessBuilder processBuilder = new ProcessBuilder("ssmtp", recipient); Process ssmtpProcess = processBuilder.start(); // 获取ssmtp进程的输入流(我们要往这里写邮件内容) OutputStream processInput = ssmtpProcess.getOutputStream(); BufferedReader fileReader = new BufferedReader(new FileReader(messageFile)); String line; // 逐行读取邮件内容并写入进程 while ((line = fileReader.readLine()) != null) { processInput.write((line + System.lineSeparator()).getBytes()); processInput.flush(); } // 关闭流,告知ssmtp输入已完成 fileReader.close(); processInput.close(); // 等待进程执行结束,检查退出码 int exitCode = ssmtpProcess.waitFor(); if (exitCode == 0) { System.out.println("邮件发送成功!"); } else { // 读取错误输出排查问题 BufferedReader errorReader = new BufferedReader( new InputStreamReader(ssmtpProcess.getErrorStream()) ); String errorLine; System.err.println("发送失败,错误信息:"); while ((errorLine = errorReader.readLine()) != null) { System.err.println(errorLine); } errorReader.close(); } } catch (IOException | InterruptedException e) { e.printStackTrace(); } } }
额外调试技巧
如果还是发送失败,一定要读取ssmtp的错误输出流(process.getErrorStream()),它会告诉你具体的问题——比如sSMTP配置错误、文件权限不足、或者邮件格式不符合要求等。
内容的提问来源于stack exchange,提问作者Genative
相关产品推荐
相关产品推荐

