java - 使用 JavaMail 阅读电子邮件内容时出现编码问题

标签 java email encoding utf-8 jakarta-mail

我正在使用 JavaMail 1.4.1(我已经升级到 1.4.5 版本但遇到了同样的问题)从电子邮件帐户中读取消息,但是我在内容编码方面遇到了问题:

POP3Message pop3message;
... 
Object contentObject = pop3message.getContent();
...   
String contentType = pop3message.getContentType();
String content = contentObject.toString();

有些消息可以正确阅读,但有些消息由于编码不合适而出现奇怪的字符。我意识到它不适用于特定的内容类型。

如果 contentType 是以下任何一个,它会很好地工作:

  • text/plain; charset=ISO-8859-1

  • text/plain;
    charset="iso-8859-1"

  • text/plain;
    charset="ISO-8859-1";
    format="flowed"

  • text/plain; charset=windows-1252

但如果是,则不会:

  • text/plain;
    charset="utf-8"

对于此 contentType(UTF-8 之一),如果我尝试获取编码 (pop3message.getEncoding()),我会得到

quoted-printable

对于后一种编码,我在调试器中获得了字符串值(与持久化对象后在数据库中看到的方式相同):

Ubicación (instead of 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

最佳答案

您如何检测这些消息是否包含“奇怪的字符”?你在某处显示数据吗?您用于显示数据的任何方法都可能无法正确处理 Unicode 字符。

第一步是确定问题是您输入了错误的字符,还是正确的字符显示不正确。您可以检查数据中每个字符的 Unicode 值(例如,在从 getContent 方法返回的字符串中)以确保每个字符都具有正确的 Unicode 值。如果是,则问题出在您用来显示字符的方法上。

关于java - 使用 JavaMail 阅读电子邮件内容时出现编码问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13385311/

相关文章:

php - 使用 CSS 的 CakePHP 电子邮件

Python如何正确打印cp1258越南语字符?

java - 如何使用 AsyncTask 分配全局变量

email - Paypal 沙盒新帐户电子邮件确认

Java使用正则表达式分割并丢弃重复的字符

ruby-on-rails - 如何处理 UTF-8 电子邮件 header (如主题 :) using Ruby?

linux - gradle构建时无效的编码名称UTF8

javascript - Python 的 urllib.parse.quote() 和 urllib.parse.unquote() 的等效 JavaScript 函数

java - 更改 Graphic2D 形状

java - 如何解析 Location.distanceBetween 方法的结果?