最近在弄用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);