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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值