【发布时间】:2012-11-03 07:58:14
【问题描述】:
我正在使用 JavaMail 1.4.1 从电子邮件帐户读取消息(我已升级到 1.4.5 版本,但遇到了同样的问题),但我遇到了内容编码问题:
POP3Message pop3message;
...
Object contentObject = pop3message.getContent();
...
String contentType = pop3message.getContentType();
String content = contentObject.toString();
有些消息可以正确读取,但有些消息由于编码不合适而出现奇怪的字符。我意识到它不适用于特定的内容类型。
如果 contentType 是以下任何一个,它就可以正常工作:
文本/纯文本; charset=ISO-8859-1
文本/纯文本;
charset="iso-8859-1"文本/纯文本;
charset="ISO-8859-1";
格式=“流动”文本/纯文本; charset=windows-1252
但如果是,则不是:
- 文本/纯文本;
charset="utf-8"
对于这个 contentType(UTF-8 之一),如果我尝试获取编码 (pop3message.getEncoding()) 我会得到 p>
引用可打印
例如,对于后一种编码,我在调试器中得到字符串值(与持久化对象后在数据库中看到的方式相同):
Ubicación(而不是 Ubicación)
但是,如果我在浏览器中使用电子邮件客户端打开电子邮件,它可以毫无问题地阅读,而且是普通邮件(没有附件,只有文本),所以邮件似乎没问题。
知道如何解决这个问题吗?
谢谢。
更新 这是我添加的一段代码,用于尝试 jlordo 给出的函数 getUTF8Content()
POP3Message pop3message = (POP3Message) message;
String uid = pop3folder.getUID(message);
//START JUST FOR TESTING PURPOSES
if(uid.trim().equals("1401")){
Object utfContent = pop3message.getContent();
System.out.println(utfContent.getClass().getName()); // it is of type String
//System.out.println(utfContent); // if not commmented it prints the content of one of the emails I'm having problems with.
System.out.println(pop3message.getEncoding()); //prints: quoted-printable
System.out.println(pop3message.getContentType()); //prints: text/plain; charset="utf-8"
String utfContentString = getUTF8Content(utfContent); // throws java.lang.ClassCastException: java.lang.String cannot be cast to javax.mail.util.SharedByteArrayInputStream
System.out.println(utfContentString);
}
//END TEST CODE
【问题讨论】:
-
你在哪里看到
Ubicación (instead of Ubicación)?安慰?变量检查器?我怀疑一切都很好,但调试器无法显示 utf-8 字符。 -
@jlordo 在 Eclipse 的调试器中,我通过观察 content 变量中的内容来了解这一点。同样在数据库 postgresql 中,如果我进行选择,我会得到该结果。
-
你是从数据库中读取,还是先写入数据库再读取?数据库设置正确吗?
-
@jlordo 如果我在数据被持久化之前就检测到问题,怎么可能是数据库的问题?
-
@jlordo 在持久化数据之前我在调试器中观察它,我将它保存到日志中,我什至在控制台中打印它并且所有这些都以相同的方式(使用 ISO-8859- 1和windows-1252正确显示)。将其保存在数据库中后,我可以通过使用 PostgreSQL 的管理员看到完全相同的内容。您真的认为 Eclipse、控制台、日志以及后来的 PostgreSQL 管理员无法正确打印吗?我想这一定是Javamail的问题。
标签: java email encoding utf-8 jakarta-mail