【问题标题】:JavaMail not correctly decoding ISO-8859-1 mailJavaMail 未正确解码 ISO-8859-1 邮件
【发布时间】:2019-05-02 17:37:08
【问题描述】:

我收到来自 IMAP 服务器的消息,该消息使用 JavaMail 使用Content-Transfer-Encoding: 8bit 进行编码。据我所知,服务器正确输出了消息并且可以对其进行解码,因为telnet 和 Thunderbird 都显示包含德语短语“Mit freundlichen Grüßen”(“真诚的你的”)的消息。

但是,当我使用 JavaMail 检索 MimeMessage 并使用以下代码获取其 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) {
  // ...
}

如果我尝试使用MimeMessagegetRawInputStream () 函数获取邮件内容,情况会变得“更糟”;然后它返回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"))
);

(但是当我尝试的时候也没有用)还是我(和/或服务器)在做其他明显错误的事情?

【问题讨论】:

  • 电子邮件的标题是什么?
  • Content-Type: text/plain; charset=utf-8; format=flowedContent-Transfer-Encoding: 8bit (但是,我刚刚注意到,当我单击“显示源代码”时,Thunderbird 显示的内容非常相似,但与我得到的字符串不完全相同)跨度>
  • new InputStreamReader (msg.getInputStream (), "ISO-8859-1")
  • 你为什么还要使用getInputStream(然后在没有明确指定字符集的情况下使用InputStreamReader)?如果你正确使用 JavaMail,你不应该有这个问题,因为你会在正确的部分使用 getContent() 并让它被 JavaMail 正确解码(至少:假设它首先被正确编码)。
  • @MarkRotteveel 请给出答案,以便我 +1

标签: java jakarta-mail iso-8859-1


【解决方案1】:

读完一行后,再尝试转换为时已晚。使用new InputStreamReader (msg.getInputStream (), "ISO-8859-1")

【讨论】:

  • 但是,这导致Mit freundlichen GrüÃÂen(与getRawInputStream () 得到的结果相同),我不明白。正如你所说,我知道字符集应该应用于InputStreamReader,但不知道为什么它根本不起作用。
  • 也许数据真的是 utf-8 数据并且标头错误地将其表示为 iso-8859-1 数据?尝试在 InputStreamReader 中使用“utf-8”,看看是否有帮助。
  • @AlexanderLeithner 那时不要使用其中任何一个。使用getContent
猜你喜欢
  • 2012-07-23
  • 2013-05-05
  • 1970-01-01
  • 2020-08-01
  • 2014-11-18
  • 2015-06-20
  • 1970-01-01
  • 2011-03-28
  • 1970-01-01
相关资源
最近更新 更多