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

使用默认邮件客户端从Java发送电子邮件,java,Java,我有Java代码,可以发送电子邮件。 默认邮件客户端将正确打开,收件人和主题也会顺利设置,但正文未设置。没有显示尸体。这是我的密码: public void emailOhneStandort() throws URISyntaxException { try { composeEmail("benjamin.koubik@daimler.com", "Thanks for the snippet!", "Hello Raffael,\

我有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;
}

通过在Windows上的尝试,我发现我需要用
^
退出
&

因此,如果我这样做:

C:\>start mailto:test@example.com?subject=foo&body=bar
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
C:\>start mailto:test@example.com?subject=foo^&body=bar
然后它就如预期的那样工作了

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


记录在案,这似乎值得补充一点,这是一个有点奇怪的要求,如果这是您为生产代码所做的事情,将由您以外的任何人使用,那么这可能不是最好的方法

对。还可以添加在unix环境中的
\&
\?
\%
。(或者只是将整个字符串放在单引号中,但我不确定它是否是跨终端的)我知道OP使用的是不同的方法,但在使用该方法时,我不必转义任何内容(至少在Windows上)。如果没有忽略
exec
调用中的错误消息,您就会得到错误的线索。