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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 08:54:58