【发布时间】: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) {
// ...
}
如果我尝试使用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"))
);
(但是当我尝试的时候也没有用)还是我(和/或服务器)在做其他明显错误的事情?
【问题讨论】:
-
电子邮件的标题是什么?
-
Content-Type: text/plain; charset=utf-8; format=flowed和Content-Transfer-Encoding: 8bit(但是,我刚刚注意到,当我单击“显示源代码”时,Thunderbird 显示的内容非常相似,但与我得到的字符串不完全相同)跨度> -
new InputStreamReader (msg.getInputStream (), "ISO-8859-1") -
你为什么还要使用
getInputStream(然后在没有明确指定字符集的情况下使用InputStreamReader)?如果你正确使用 JavaMail,你不应该有这个问题,因为你会在正确的部分使用getContent()并让它被 JavaMail 正确解码(至少:假设它首先被正确编码)。 -
@MarkRotteveel 请给出答案,以便我 +1
标签: java jakarta-mail iso-8859-1