java 邮件乱码_javamail 收发邮件 乱码问题解决

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值