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