前一段時間做過一個郵件發送的服務,以前大體都測試過,文本、圖片、附件都是沒有問題的,可有同事反應發送的附件名稱有中文亂碼,類似如下截圖展示:
咋一看不像亂碼,抱著試試看的態度,為MimeMessageHelper硬性加了編碼:
1
|
helper.addAttachment(MimeUtility.encodeText(fileName), file); |
并且對文件名稱加了轉碼:
1
|
MimeUtility.encodeText(attachmentFilename) |
但是,如果你跟進源碼會發現spring已經為你做了轉碼工作,所以這個問題不存在的。
繼續跟進MimeBodyPart類,發現setFileName方法中有個ParameterList類,點擊繼續跟進ParameterList類,里面的toString方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
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,發現了其在類開頭已經定義了
1
2
|
private static final boolean splitLongParameters = PropUtil |
大致意思就是,編碼后的文件名長度如果大于60并且splitLongParameters的值為true,encodeParameters的值為true,文件名就會被截取,想想編碼后的值被截取是什么樣子?也只能是文章開頭截圖的顯示了。
最終的解決方案就是,在發送的時候初始化splitLongParameters為false不截取:
1
2
3
|
static { System.setProperty( "mail.mime.splitlongparameters" , "false" ); } |
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。
原文鏈接:https://blog.52itstyle.com/archives/1779/?utm_source=tuicool&utm_medium=referral