JavaMail之Subject乱码解决之道

同学做的邮件同步系统 出了点小问题,发现用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 [email protected] >
From:[email protected]
To:[email protected]
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多网页,但翻了一下,没发现有说这个问题的,希望我的一个解决办法可以帮到有需要的人

你可能感兴趣的:(Java)