最近在開發一個郵件發送多附件的微服務,使用的是org.springframework.mail.javamail.JavaMailSender;包下面的JavaMailSender
但是發送出來的附件名字都是亂碼格式,如下:

跟進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,文件名就會被截取,想想編碼后的值被截取是什么樣子?也只能是文章開頭截圖的顯示了。
最終的解決方案就是,在發送的時候初始化splitLongParameters為false不截取:
static {
System.setProperty("mail.mime.splitlongparameters","false");
}
