java - Desktop.Action.MAIL 为 mailto : in URI 正确编码主题和正文字符串

标签 java email encoding desktop mailto

我有一个特定于 Java 6 中的 Java Desktop API 的问题,更具体地说是 desktop.mail(URI uri)..

我想知道是否有一个函数可以用来确保 f.ex 中的主题和正文:

mailToURI = new URI("mailto", getToEmails() + "?SUBJECT="+ getEmailSubject() + "&BODY="+ getEmailBody(), null);

桌面.mail(mailToURI);

将按照 rfc2368 进行保存并在电子邮件应用程序中仍能正确显示?

现在有问题的文本示例是斯堪的纳维亚字母:æøå/ÆØÅ 并在正文中添加复杂的 URL,其中包含和号 (&) 等 f.ex:http://www.whatever.com?a=b&c=d 等。

在使用 mailto: URI 方案和 Java Desktops 邮件 (URI) 函数时,Java 中是否有一个函数可以确保上述寻求的完整性得以保留?

有没有可能做一个?

此时我已经尝试了所有我能想到的方法,包括:

  • MimeUtility.encodeText()
  • URLEncode.encode(..
  • 自定义函数 encodeUnusualCharacters()

private static final Pattern SIMPLE_CHARS = Pattern.compile("[a-zA-Z0-9]");

private String encodeUnusualChars(String aText) {
    StringBuilder result = new StringBuilder();
    CharacterIterator iter = new StringCharacterIterator(aText);
    for (char c = iter.first(); c != CharacterIterator.DONE; c = iter.next()) {
        char[] chars = {c};
        String character = new String(chars);
        if (isSimpleCharacter(character)) {
            result.append(c);
        } else {
            //hexEncode(character, "UTF-8", result);
        }
    }
    return result.toString();
}

private boolean isSimpleCharacter(String aCharacter) {
    Matcher matcher = SIMPLE_CHARS.matcher(aCharacter);
    return matcher.matches();
}

/**
For the given character and encoding, appends one or more hex-encoded characters.
For double-byte characters, two hex-encoded items will be appended.
 */
private static void hexEncode(String aCharacter, String aEncoding, StringBuilder aOut) {
    try {
        String HEX_DIGITS = "0123456789ABCDEF";
        byte[] bytes = aCharacter.getBytes(aEncoding);
        for (int idx = 0; idx < bytes.length; idx++) {
            aOut.append('%');
            aOut.append(HEX_DIGITS.charAt((bytes[idx] & 0xf0) >> 4));
            aOut.append(HEX_DIGITS.charAt(bytes[idx] & 0xf));
        }
    } catch (UnsupportedEncodingException ex) {
        Logger.getLogger(LocalMail.class.getName()).log(Level.SEVERE, null, ex);
    }
}
  • 还有更多...

我最多只能在打开的电子邮件中看到经过编码的文本。

不提供任何特殊编码将导致 æøå 或类似停止对内容的进一步处理。

我觉得我错过了一些重要的东西。谁能给我一个解决方案?

对于换行符,我使用 String NL = System.getProperty("line.separator");

也许需要调用一些系统特定的东西才能使它正常工作??

顺便说一下,我目前使用的是 Mac OS X 10.6.8 和 Mail 4.5

marius$ java -version Java 版本“1.6.0_26” Java(TM) SE 运行时环境(build 1.6.0_26-b03-384-10M3425) Java HotSpot(TM) 客户端 VM(构建 20.1-b02-384,混合模式)

我真的觉得必须有办法——否则 desktop.mail(URI) 函数的主题和消息部分完全不可靠,以至于无法使用。

非常感谢任何帮助我指明正确方向的人!!

最佳答案

谢谢 Marius,这是一行非常有用的代码。

为了性能我稍微修改了一下...

当您不使用 RegExp 时,最好使用“replace”而不是“replaceAll”。

这个:

.replace("+", "%20")

快于:

.replaceAll("\\+", "%20")

两者都替换ALL occurrences,但第一个不必进行任何正则表达式解析。 http://docs.oracle.com/javase/6/docs/api/java/lang/String.html#replace%28java.lang.CharSequence,%20java.lang.CharSequence%29

另外,如果原始字符串已经有\r\n 换行,第二个替换将使\r 加倍。这不是什么大问题,但我更愿意删除那个并提供正确的输入字符串:

String result = java.net.URLEncoder.encode(src, "utf-8").replace("+", "%20")

关于java - Desktop.Action.MAIL 为 mailto : in URI 正确编码主题和正文字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6762155/

相关文章:

java - 在 Java 应用程序中读取 XML 文件的最佳/最简单方法是什么?

java - 如何使用父表ID获取子表行?

email - punycode编码的电子邮件地址可以与 "real"地址冲突吗?

javascript - 使用 ng-pattern 的多封电子邮件的正则表达式

iphone - MFMailComposeViewController 图像方向

mysql - 使用 mysql 的 Rails LIKE 查询

java - Hibernate - 查询为实体中的所有字段返回空值,而同一查询从数据库中完美返回

java - 我的 Java 聊天机器人代码不起作用,我不知道为什么

python - KOI8-R : Having trouble translating a string

Python 解析 HTML 时的 Unicode 和 ASCII 问题