Desktop.Action.MAIL正确编码mailto的主题和正文字符串:在URI中

时间:2011-07-20 12:48:33

标签: java email encoding desktop mailto

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

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

mailToURI =新URI(“mailto”,getToEmails()+“?SUBJECT =”+ getEmailSubject()                             +“& BODY =”+ getEmailBody(),null);

desktop.mail(mailToURI);

是否会按照rfc2368保存,仍然可以在电子邮件应用程序中正确显示?

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

Java中是否有一个函数可以确保在使用带有Java桌面邮件(URI)函数的mailto:URI方案时保留上述搜索完整性?

是否可以制作一个?

此时我已经尝试了我能想到的一切,包括:

  • 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运行时环境(版本1.6.0_26-b03-384-10M3425) Java HotSpot(TM)客户端VM(版本20.1-b02-384,混合模式)

我真的觉得必须有办法 - 否则desktop.mail(URI)函数的主题和消息部分完全不可靠到无用的地步。

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

2 个答案:

答案 0 :(得分:1)

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

我为表演修改了一下......

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

此:

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

比以下更快:

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

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

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

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

答案 1 :(得分:0)

试试这个,希望它对你有用。

String result = java.net.URLEncoder.encode(src, "utf-8").replaceAll("\\+", "%20").replaceAll("\\%0A", "%0D%0A");