JavaMail не правильно декодирует почту ISO-8859-1 - PullRequest
0 голосов
/ 30 ноября 2018

Я получаю сообщение от сервера IMAP, который закодирован с использованием Content-Transfer-Encoding: 8bit с использованием JavaMail.Насколько я могу судить, сервер правильно выводит сообщение, и оно может быть декодировано, поскольку и telnet, и Thunderbird отображают сообщение, которое содержит немецкую фразу "Mit freundlichen Grüßen" ("Искренне ваш") в том виде, в каком она есть.

Однако, когда я получаю MimeMessage с помощью JavaMail и получаю его InputStream с помощью следующего кода, он возвращает Mit freundlichen GrüÃen (с одним невидимым 0x9F байтом после второго Ã):

MimeMessage msg = imapFolder.getMessages() [0]; // Just for demo purposes
StringBuilder builder = new StringBuilder ();
String line;

try (
  BufferedReader reader = new BufferedReader (
    new InputStreamReader (msg.getInputStream ())
  )
) {
  while ((line = reader.readLine ()) != null) {
    builder.append (line).append ("\n");
  }
} catch (IOException e) {
  // ...
}

Ситуация становится немного «хуже», если я пытаюсь получить содержимое письма с помощью функции MimeMessage getRawInputStream ();затем он возвращает Mit freundlichen GrüÃÂen (с невидимыми 0x83 байтами после двух à и невидимым 0x9F байтами после Â).

Однако, насколько я могу судить, обе функции должныверните правильное сообщение.

Должен ли я делать

builder.append (line.getBytes ("ISO-8859-1")).append ("\n");

или

BufferedReader reader = new BufferedReader (
  new InputStreamReader (msg.getInputStream (), Charset.forName ("ISO-8859-1"))
);

(но это не сработало, когда я пытался) или я (и / или сервер) делать что-то еще явно не так?

1 Ответ

0 голосов
/ 30 ноября 2018

Когда вы прочитали строку, уже слишком поздно, чтобы попробовать преобразование.Используйте new InputStreamReader (msg.getInputStream (), "ISO-8859-1").

...