Desktop.Action.MAIL правильно кодирует тему и строки тела для mailto: в URI - PullRequest
2 голосов
/ 20 июля 2011

У меня есть вопрос, специфичный для Java Desktop API в Java 6, более конкретно desktop.mail (URI uri) ..

Мне было интересно, есть ли функция, которую можно использовать, чтобы гарантировать, что субъект и тело в f.ex:

mailToURI = новый URI ("mailto", getToEmails () + "? SUBJECT =" + getEmailSubject () + "& BODY =" + getEmailBody (), null);

desktop.mail (mailToURI);

будет храниться в соответствии с rfc2368 и все равно будет корректно отображаться в приложении электронной почты?

Прямо сейчас примерами проблемных текстов являются скандинавские буквы: æøå / ÆØÅ и добавление сложных URL-адресов в теле, содержащее амперсанды (&) и такие f.ex: http://www.whatever.com? A = b & c = d и т.д ..

Существует ли в Java функция, обеспечивающая сохранение указанной целостности при использовании схемы mailto: URI с функцией почты (URI) Java Desktops?

Можно ли было бы сделать один?

На данный момент я перепробовал все, что мог придумать, включая:

  • MimeUtility.encodeText ()
  • URLEncode.encode (..
  • Пользовательская функция encodeUnusualCharacters ()

частный статический окончательный шаблон 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 Runtime Environment (сборка 1.6.0_26-b03-384-10M3425) Клиентская виртуальная машина Java HotSpot (TM) (сборка 20.1-b02-384, смешанный режим)

Я действительно чувствую, что должен быть способ - в противном случае тема и часть сообщения функции desktop.mail (URI) совершенно ненадежны до такой степени, что бесполезны.

Любая помощь, чтобы указать мне в правильном направлении, очень ценится!

Ответы [ 2 ]

1 голос
/ 02 мая 2012

Спасибо, Мариус, это очень полезная строка кода.

Я немного ее изменил для исполнения ...

Лучше использовать "replace" вместо "replaceAll", когдаВы не используете RegExp.

Это:

.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.Это не большая проблема, но я предпочитаю удалить ее и указать правильную строку ввода:

String result = java.net.URLEncoder.encode(src, "utf-8").replace("+", "%20")
0 голосов
/ 28 ноября 2011

Попробуйте, надеюсь, это сработает для вас.

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