使用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;
}
网友评论