最近在開發一個郵件發送多附件的微服務,使用的是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"); }