我在使用java mail api(jdk 1.6)阅读邮件时遇到问题。 我正在使用part.getContent()方法。在获取消息内容时,我会得到例外情况。
java.io.UnsupportedEncodingException: X-iso885915
java.io.UnsupportedEncodingException: windows-1252http-equivContent-type
java.io.UnsupportedEncodingException: _iso-2022-jp$ESC
java.io.UnsupportedEncodingException: iso-8859-1
java.io.UnsupportedEncodingException: x-ias-norwegian
java.io.UnsupportedEncodingException: X-iso885915
java.io.UnsupportedEncodingException: cp-850
有没有办法绕过这些编码异常。我需要阅读邮件中的发件人,收件人,收到邮件和附件的时间。我不需要阅读正文。因为可能有更多这种类型的字符集。所以如何正确阅读这种类型的编码消息。我google了很多但没有找到解决办法,除了暗示太阳jdk可能不支持这些字符集。
感谢。
答案 0 :(得分:0)
我找到了一个可能有用的解决方案。但我不确定这是否是正确的解决方案。
我们可以定义一个自定义字符集提供程序,并让它知道jdk例如
package path.to.UnknownCharsetProvider;
import java.nio.charset.*;
import java.nio.charset.spi.*;
import java.util.*;
public class UnknownCharsetProvider extends CharsetProvider {
private static final String badCharset = "_iso-2022-jp$ESC";
private static final String goodCharset = "iso-8859-1";
public Charset charsetForName(String charset) {
if (charset.equalsIgnoreCase(badCharset))
return Charset.forName(goodCharset);
return null;
}
public Iterator<Charset> charsets() {
return null;
}
}
为了让JDK知道它,在META-INF目录中的服务文件夹中定义一个名为“ java.nio.charset.spi.CharsetProvider ”的文件,并输入你的charset提供者它为前。 的 path.to.UnknownCharsetProvider 强> 对于一个坏的charset它将返回你想要返回的charset。但是我不确定你为一个坏的字符集提供的字符集是否可以正确解码消息文本或者不是:(
来自http://www.oracle.com/technetwork/java/faq-135477.html#imapserverbug的问题问:当我在包含文本数据的bodypart上调用getContent()时,为什么会得到UnsupportedEncodingException?