在java中运行linux命令以发送带引号的电子邮件

ale*_*der -1 java linux

我可以通过命令行在Linux中发送电子邮件:

cat < x.txt | mail -s "SUBJECT" email@email.com
Run Code Online (Sandbox Code Playgroud)

这非常有效.注意:身体在x.txt.

现在,我想用Java执行这个命令.

Process p = Runtime.getRuntime().exec(
            new String[] { "cat < x.txt", "|", "mail -s", "SUBJECT",
                    "email@email.com" });

    p.waitFor();
    BufferedReader buf = new BufferedReader(new InputStreamReader(
            p.getInputStream()));
    String line = "";
    String output = "";

    while ((line = buf.readLine()) != null) {
        output += line + "\n";
    }

System.out.println(output);
Run Code Online (Sandbox Code Playgroud)

好吧,它不工作,我得到跟随错误.

Exception in thread "main" java.io.IOException: Cannot run program "cat < x.txt |": error=2, Datei oder Verzeichnis nicht gefunden
        at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
        at java.lang.Runtime.exec(Runtime.java:620)
        at java.lang.Runtime.exec(Runtime.java:485)
        at test.main(test.java:9) Caused by: java.io.IOException: error=2, Datei oder Verzeichnis nicht gefunden
        at java.lang.UNIXProcess.forkAndExec(Native Method)
        at java.lang.UNIXProcess.<init>(UNIXProcess.java:248)
        at java.lang.ProcessImpl.start(ProcessImpl.java:134)
        at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
        ... 3 more
Run Code Online (Sandbox Code Playgroud)

我将这些命令分开了吗?

如何正确执行此命令?

Eve*_*sle 5

尝试编写脚本并执行它,而不是执行单独的命令:

String email = "email@email.com"; // Or any way of entering the email address
String[] command = {"/bin/sh", "-c", "cat < x.txt | mail -s SUBJECT" +  email};
Process p = Runtime.getRuntime().exec(command);
Run Code Online (Sandbox Code Playgroud)

Pipe(|)是内置的shell,而不是实际的unix命令.