使用java mail讀取郵件京腥,發(fā)現(xiàn)小部分郵件標(biāo)題出現(xiàn)亂碼情屹。
(600438???點(diǎn)評(píng)
獲取標(biāo)題的代碼如下:
public String getSubject(MimeMessage msg) throws Exception {
return msg.getSubject();
}
郵件客戶端顯示正常敌厘,不亂碼糠亩,正確的標(biāo)題是
(600438)點(diǎn)評(píng)
1.打印?的值是65533
2.跟蹤到最原始的Subject
String[] strMailSubject = msg.getHeader("subject");
打印出來如下(有些省略)
?utf-8?B?77yINjAwNDM477yJ54K56K+E7?=
=?utf-8?B?7ya56ym5ZCI6aKE5pyf44CC?==
正確的標(biāo)題base64編碼結(jié)果如下
77yINjAwNDM477yJ54K56K+E77ya56ym5ZCI6aKE5pyf44CC
發(fā)現(xiàn)刪除
=?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;
}