同学做的邮件同步系统 出了点小问题,发现用JavaMail获得的Subject,发信人,收信人等出现乱码。打开eml查看时,发现邮件内容是这样的:
Received:from mail.miibeian.gov.cn (unknown [211.94.161.4])
by mx22 (Coremail) with SMTP id wKjR3rAbKgURz1pFnD6uBA==.49280S2;
Wed, 15 Nov 2006 16:25:54 +0800 (CST)
Received:from nisac ([211.94.161.58])
(authenticated)
by mail.miibeian.gov.cn (8.11.6/8.11.6) with ESMTP id kAF9BBR27094
for
<
fzg502
@163.com
>
; Wed, 15 Nov 2006 17:11:12 +0800
Message-Id:
<
200611150911
.kAF9BBR27094@mail.miibeian.gov.cn
>
From:webmaster@mail.miibeian.gov.cn
To:fzg502@163.com
Subject:=?gb2312?B?KMjw0MfM4cq+LbTL08q8/r/JxNzKx8Csu/jTyrz+KQ==?=ICP备案网站邮件验证码(注册用户:pianoforever)
Date:2006-11-15 16:40:08
MIME-Version:1.0
Content-Type:multipart/mixed;
boundary="BAABD165.BAABD165"
X-Brightmail-Tracker:AAAAAQAAAAQ=


--BAABD165.BAABD165
Content-Type: text/plain;
charset="gb2312"
Content-Transfer-Encoding: 8bit

尊敬的用户,您的ICP备案信息注册成功!用户名:pianoforever,邮件验证码是:13738096,手机验证码已发送到您注册的手机中。请登录ICP备案网站http://www.miibeian.gov.cn,登录后分别输入手机验证码和邮件验证码,通过验证后就可以开展各项工作了。


--BAABD165.BAABD165
Content-Type: text/plain;
charset="gb2312"
Content-Transfer-Encoding: 8bit

发送时间:Wednesday, November 15, 2006 16:31:40

--BAABD165.BAABD165--
请看Subject的内容,格式是这样的 =?格式xx一段编码xxx?=一段文本
正确解释的主题是:(瑞星提示-此邮件可能是垃圾邮件)ICP备案网站邮件验证码(注册用户:pianoforever)
但JavaMail的MimeMessage.getSubject()得到的是:
(瑞星提示-此邮件可能是垃圾邮件)ICPxxxx乱码xxpianoforever)
可以看到是前半部分解码正确,而后面半部分解码错误,查找了一下没发现MimeMessage提供设置解码格式,于是测试了一下,发现MimeMessage用了ISO8859_1解码!!!又不允许更改,我倒。。。Class.getResourcesAsStream又是这样,sun的国际化真是太国际了!
于是,想到一个办法,获得Subject等信息,手动写解码部分:
//
.........mimeMessage为MimeMessage的instance
String subject
=
""
;

try
...
{
String[] strs = mimeMessage.getHeader("Subject");

for (String str : strs) ...{//一般主题不会有多个吧?其它属性自己处理啦
subject = new String(str.getBytes("ISO8859_1"), "GBK");
}
subject = MimeUtility.decodeText(subject);//base64解码

}
catch
(Exception exce)
...
{
}
//
.........
用这种方法可以很好的解决了中文乱码问题,其实很多东西不想想像中那么难,只是没有迈出那一步。(我也是因为这个问题才接触到JavaMail,它是什么样东西也不大清楚,但字符编码这东西是不变的,有乱码了就一定是哪里解码错误了)
ps:百度搜了一下,找了N多网页,但翻了一下,没发现有说这个问题的,希望我的一个解决办法可以帮到有需要的人