Заголовок темы в apache camel для почты, показывающей "=? Iso-2022-jp .." для японского символа - PullRequest
0 голосов
/ 12 января 2019

У меня ниже Java-код, который выбирает электронное письмо из папки «Входящие» и пишет в очередь activeMQ, в которой в качестве темы используется текст на японском языке.

public class SimpleRouteBuilder extends RouteBuilder {

    @Override
    public void configure() throws Exception {
        from("imaps://outlook.office365.com?username=*****&password=****&unseen=true&connectionTimeout=600000&mapMailMessage=truecopyTo=out")
        .process(new MyProcessor())
        .to("jms:queue:OUTqueue");

    }
}

И в MyProcessor() я получаю

String sub = exchange.getIn().getHeader("Subject").toString();

Эта тема возвращает "=?iso-2022-jp?B?UkU6IBskQiFaJDQwTU1qIVsbKEJqYXBhbmVzZQ==?=", а не фактический японский текст, с основным текстом проблем нет.

Любая помощь, как получить японский текст предмета?

Ответы [ 2 ]

0 голосов
/ 12 января 2019

Этот метод getHeader возвращает необработанное значение заголовка, и оно кодируется с использованием кодировки текста RFC-2047 . Предполагая, что вы используете JavaMail, вы можете декодировать его, используя javax.mail.internet.MimeUtility, в частности MimeUtility.decodeText (и для полностью корректного поведения, unfold, см. Код ниже, хотя это и необязательно для указанного значения).

В качестве альтернативы, если это JavaMail Message (в частности, MimeMessage или подкласс), используйте getSubject() вместо getHeader("Subject"). Это автоматически расшифрует значение. Смотрите его реализацию в JavaMail 1.6.2:

public String getSubject() throws MessagingException {
    String rawvalue = this.getHeader("Subject", (String)null);
    if (rawvalue == null) {
        return null;
    } else {
        try {
            return MimeUtility.decodeText(MimeUtility.unfold(rawvalue));
        } catch (UnsupportedEncodingException var3) {
            return rawvalue;
        }
    }
}

Например, следующий код:

String encodedValue = "=?iso-2022-jp?B?UkU6IBskQiFaJDQwTU1qIVsbKEJqYXBhbmVzZQ==?=";
String decodedValue = MimeUtility.decodeText(encodedValue);
System.out.println(decodedValue);

распечатает:

RE: 【ご依頼】japanese
0 голосов
/ 12 января 2019

Измените ... сообщение как байт [] на то, что применимо в вашем случае.

byte[] text = ... message as byte[];
String textAsUnicode = new String(text,"ISO2022JP");

Список поддерживаемых кодировок Oracle

...