- 上网查了一大堆,都是说调用MimeUtility.encodeText()或者.MimeUtility.encodeWord()方法,但是然并卵。
我先跟大家细说一下这是个什么情况吧,比如说通过开发的手机端邮箱功能,发送附件,附件名称类似下边图片这种:
接着我们发送邮件,包含图上所示的附件,OK,我们发送成功了(这个过程就不给大家展示了,哈哈...)
然后我们打开邮箱客户端,查看附件,WTF,这是个什么鬼,我的邮件名称不见了。
刚开始我是真的是一个字符的增加的去试,最终只有一个结果,就是单字节降低到一定程度的话,邮箱客户能正常显示附件名称了,妈呀,这谁能受得了,各种打断点,确认了这压根不是编码的问题呀,真是坑爹。
后来实在没办法,硬着头皮看源码呗,一看了不得呀,在MimeBodyPart的setFileName()方法中发现了一个ParameterList ,
这个类是干嘛地呀,说白了就是一个附件name的集合,那么重点来,我们看一下这个的类的toString()方法
这个方法的最后十几行代码,把这次事故都交代清楚了,罪魁祸首就是他。
fileName如果太长,超过60个字符,会被截断,截断....javamaila的这命名规范也太恶了吧,60个字符就给截断了,对开发来说,随便搞个name,随便base64一下,这长度您敢想,超过60岂不是很随意。
重点来了,既然问题来了,那么怎么解决呢,很简单:
既然你要截断,那我就不让你截断,我们发现截断的条件,1,字符超过60;2,splitLongParameters =true;3,encodeParameters=true;
我想大家从字面上都是知道splitLongParameters这个是啥意思了吧,就是分裂、截断,终于找到根源了,那么干掉他:
在Application里边加上一行代码: System.setProperty("mail.mime.splitlongparameters","false");
OK,解决了,在这里建议大家,在开发邮箱的时候,多注意一下javamail的环境变量的配置,环境变量地址。
好了,今天就写到这里了,如果有什么问题,可以评论哦。