最近在开发一个邮件发送多附件的微服务,使用的是org.springframework.mail.javamail.JavaMailSender;包下面的JavaMailSenderjava
可是发送出来的附件名字都是乱码格式,以下:spring
跟进MimeBodyPart类,发现setFileName方法中有个ParameterList类,点击继续跟进ParameterList类,里面的toString方法:微服务
if ((value.length() > 60) && (splitLongParameters) && (encodeParameters)) { int seg = 0; name = name + "\*"; while (value.length() > 60) { sb.addNV(name + seg, quote(value.substring(0, 60))); value = value.substring(60); ++seg; } if (value.length() > 0) sb.addNV(name + seg, quote(value)); } else { sb.addNV(name, quote(value)); }
上面这段代码的逻辑,你们应该能够很清晰的理解了吧,你们能够发现若是value.length() > 60 而且 splitLongParameters?哎,问题来了,splitLongParameters究竟是个什么值,咱们查找splitLongParameters,发现了其在类开头已经定义了编码
private static final boolean splitLongParameters = PropUtil .getBooleanSystemProperty("mail.mime.splitlongparameters", true);
大体意思就是,编码后的文件名长度若是大于60而且splitLongParameters的值为true,encodeParameters的值为true,文件名就会被截取,想一想编码后的值被截取是什么样子?也只能是文章开头截图的显示了。spa
最终的解决方案就是,在发送的时候初始化splitLongParameters为false不截取:code
static { System.setProperty("mail.mime.splitlongparameters","false"); }