java mail 读取邮件乱码问题

使用java mail读取邮件,发现小部分邮件标题出现乱码。
(600438���点评
获取标题的代码如下:

public String getSubject(MimeMessage msg) throws Exception {
        return msg.getSubject();
}

邮件客户端显示正常,不乱码,正确的标题是
(600438)点评

1.打印�的值是65533

2.跟踪到最原始的Subject

String[] strMailSubject = msg.getHeader("subject");

打印出来如下(有些省略)

?utf-8?B?77yINjAwNDM477yJ54K56K+E7?=
 =?utf-8?B?7ya56ym5ZCI6aKE5pyf44CC?==

正确的标题base64编码结果如下

77yINjAwNDM477yJ54K56K+E77ya56ym5ZCI6aKE5pyf44CC

发现删除
=?utf-8?B?
?=
\r
\n
空格
后跟原始base64编码是一模一样的。

解决方案:

/**
     * 获得邮件主题 
     *      
     */
    public static String getSubject(MimeMessage msg) throws Exception {
        String subject=msg.getSubject();
        if(isHave65533(subject)) {//有乱码
                try {
                    String[] strMailSubject = msg.getHeader("subject");
                    StringBuffer sb = new StringBuffer();
                    for (String str : strMailSubject) {
                        String str2=str.
                                replaceAll("=\\?utf-8\\?B\\?", "").
                                replaceAll("=\\?UTF-8\\?B\\?", "").
                                replaceAll("\\?utf-8\\?B\\?", "").
                                replaceAll("\\?=", "").
                                replaceAll("\n", "").
                                replaceAll("\r", "").
                                replaceAll(" ", "");
                        sb.append(str2);
                    }
                    subject=new String(Base64.getDecoder().decode(sb.toString()));
            } catch (Exception e) {
                logger.error(e.getMessage(),e);
                return subject;
            }
        }
        return subject;
    }

你可能感兴趣的:(java mail 读取邮件乱码问题)