javamail 收发邮件 乱码问题解决

时间:2021-09-10 18:11:14

最近在弄用javamail收发邮件,遇到一些问题,记录如下。

很多问题可以从oracle的FAQ解决:http://www.oracle.com/technetwork/java/faq-135477.html#fetch  。


1. 收邮件附件乱码。一般标题和正文的乱码都很好解决,但附件的乱码就很有问题。主要是在解码出错。

      这次遇到的编码方式有:

   1) 有GBK, GB2312, UTF-8等编码

   2) 使用B、或Q编码

         以上两点可以用一个java函数解决:MimeUtility.decodeText()

         我目前是这样,不像网上说的那样很多步骤处理。

   3) 同一个附件名字,分段编码,如:

       下面是一个附件名收到的编码:

        =?utf-8?B?5Lqn5ZOB55+l6K+G5Zyw5Zu+MjAxMjA377yI6KGM5Lia5Y+K546v5aKD77yJ?==?utf-8?Q?2.xls?=

        中文名是:产品知识地图201207(行业及环境)2.xls


        使用 MimeUtility.decodeText()上面附件解码后,得到字串:产品知识地图201207(行业及环境)=?utf-8?Q?2.xls?=
        再对后面的=?utf-8?Q?2.xls?= 解码,使用 MimeUtility.decodeText()得到字串:2.xls


       这就是分段编码,也就是:

                =?utf-8?B?5Lqn5ZOB55+l6K+G5Zyw5Zu+MjAxMjA377yI6KGM5Lia5Y+K546v5aKD77yJ?=    

                       对应    

              产品知识地图201207(行业及环境)



               =?utf-8?Q?2.xls?=     对应    2.xls


   

所以,针对上面的3种情况,写一个方法:


public String decodeMailString(String str) {

try {
if (str == null) {
return null;
}

StringBuilder sb = new StringBuilder();
String[] aStr;
while (true) {
int pos = str.indexOf("=?");
if ( pos > -1) {
str = MimeUtility.decodeText(str);
aStr = str.split("=\\?", 2);
sb.append(aStr[0]);
if (aStr.length > 1) {
str = "=?" + aStr[1];
} else {
return sb.toString();
}
}else{
return str;
}

}

} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

return null;
}


目前工作良好。我这是按顺序解码的,如果前面的字串没有解就会出问题了。


2. 收取大附件很慢

javamail默认的fetchsize是16K,可以增大一点。
props.put("mail.imap.partialfetch", "true"); "true"或"false"这个也可以试试。


增加配置:

Properties props = new Properties();
props.put("mail.imap.partialfetch", "false");
props.put("mail.imap.fetchsize", "819200");
Session session = Session.getDefaultInstance(props, null);