使用默认邮件客户端从Java发送电子邮件

时间:2018-08-14 10:42:52

标签: java

我有Java代码,应该发送电子邮件。 默认邮件客户端正确打开,并且收件人和主题也已顺利设置,但正文未设置。没有显示任何正文。这是我的代码:

public void emailOhneStandort() throws URISyntaxException {

    try {

        composeEmail("benjamin.koubik@daimler.com", "Thanks for the snippet!",
                "Hello Raffael,\r\nthis mail was initiated by Java.");
    } catch (Exception err) {
        err.printStackTrace();
    }
    System.out.println("Done!");
}

public static void composeEmail(String receiver, String subject, String body) throws Exception {

    String mailto = "mailTo:" + receiver;
    mailto += "?subject=" + uriEncode(subject);
    mailto += "&body=" + uriEncode(body);

    String cmd = "";
    String os = System.getProperty("os.name").toLowerCase();
    if (os.contains("win")) {
        cmd = "cmd.exe /c start " + mailto;
    } else if (os.contains("osx")) {
        cmd = "open " + mailto;
    } else if (os.contains("nix") || os.contains("aix") || os.contains("nux")) {
        cmd = "xdg-open " + mailto;
    }
    // Call default mail client with paramters
    Runtime.getRuntime().exec(cmd);

}

private static String uriEncode(String in) {
    String out = new String();
    for (char ch : in.toCharArray()) {
        out += Character.isLetterOrDigit(ch) ? ch : String.format("%%%02X", (int) ch);
    }
    return out;
}

1 个答案:

答案 0 :(得分:2)

通过在Windows上尝试,我发现我需要使用&来使^转义。

所以,如果我这样做:

C:\>start mailto:test@example.com?subject=foo&body=bar

我收到以下错误:

'body' is not recognized as an internal or external command, operable program or batch file.

并且我的电子邮件客户端打开,其中填充主题,但不填充正文。

如果我这样做:

C:\>start mailto:test@example.com?subject=foo^&body=bar

然后按预期运行。

我敢说类似的情况也会在其他环境中发生,但目前无法测试。

作为记录,似乎值得补充一点,这是一个奇怪的要求,如果您正在为将要被您自己以外的任何人使用的生产代码执行此操作,那可能不是最好的方法! / p>