【问题标题】:Using SSMTP and ProcessBuilder使用 SSMTP 和 ProcessBuilder
【发布时间】:2018-03-12 14:15:30
【问题描述】:

我目前正在为学校做一个项目,我正在尝试使用 sSMTP 将电子邮件从 java 发送给使用文本文件的用户。从命令行执行ssmtp email@gmail.com < msg.txt 可以正常工作,并向我发送包含msg.txt 中信息的电子邮件。但是,当我尝试使用 ProcessBuilder 在 java 中执行此操作时,它不会发送电子邮件。

`ProcessBuilder builder = new ProcessBuilder;
 builder.command("ssmtp", "email@gmail.com", "<", "msg.txt");
 Process p = builder.start();`

我相信它不喜欢我尝试在 msg.txt 中进行管道传输的位置。如果有人知道更好的方法来做到这一点,那就太好了。我还没有找到任何东西,也不知道自己该怎么做

【问题讨论】:

    标签: java


    【解决方案1】:

    您可以直接读取msg.txt 并将其写入进程'OutputStream,而不是尝试依赖shell 的重定向功能(如您所见,这不起作用)。这将是同样的事情,但在代码中(它也会是一个更好的解决方案)。

    类似的东西

    Process p = new ProcessBuilder("ssmtp").start();
    PrintStream out = new PrintStream(p.getOutputStream());
    String line = null;
    BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream("msg.txt")));
    while((line = in.readLine()) != null)
        out.println(line);
    out.close();
    in.close();
    

    但是如果你想使用我不推荐的shell重定向,你需要执行实际执行重定向的程序,即bash。以下应该可以解决问题:

    new ProcessBuilder("bash", "ssmtp", "email@gmail.com", "<", "msg.txt").start();
    

    正如 dave_thompson_085 评论的那样,执行程序化重定向更加容易。现在的事情确实很容易!

    new ProcessBuilder("ssmtp", "email@gmail.com").redirectInput(new File("msg.txt")).start();
    

    【讨论】:

    • 非常感谢!我什至没想过只是读入文件。我唯一需要更改的是在第一行中,我需要将电子邮件的目的地添加为命令。
    • 由于 j7 ProcessBuilder 可以进行重定向,但使用方法调用不是 shell 尖括号语法;请参阅 javadoc。 (旧的更基本的 Runtime.exec 不能。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-14
    • 2023-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多