SpringBoot開發案例之mail中文附件亂碼

前一段時間作過一個郵件發送的服務,之前大致都測試過,文本、圖片、附件都是沒有問題的,可有同事反應發送的附件名稱有中文亂碼

咋一看不像亂碼,抱着試試看的態度,爲MimeMessageHelper硬性加了編碼:spring

 
  1. helper.addAttachment(MimeUtility.encodeText(fileName), file);測試

而且對文件名稱加了轉碼:編碼

 
  1. MimeUtility.encodeText(attachmentFilename)spa

可是,若是你跟進源碼會發現spring已經爲你作了轉碼工做,因此這個問題不存在的。code

繼續跟進MimeBodyPart類,發現setFileName方法中有個ParameterList類,點擊繼續跟進ParameterList類,裏面的toString方法:圖片

 
  1. if ((value.length() > 60) && (splitLongParameters)get

  2.                        && (encodeParameters)) {源碼

  3.                    int seg = 0;string

  4.                    name = name + "*";it

  5.                    while (value.length() > 60) {

  6.                        sb.addNV(name + seg, quote(value.substring(0, 60)));

  7.                        value = value.substring(60);

  8.                        ++seg;

  9.                    }

  10.                    if (value.length() > 0)

  11.                        sb.addNV(name + seg, quote(value));

  12.                } else {

  13.                    sb.addNV(name, quote(value));

  14.                }

上面這段代碼的邏輯,你們應該能夠很清晰的理解了吧,你們能夠發現若是value.length() > 60 而且 splitLongParameters?哎,問題來了,splitLongParameters究竟是個什麼值,咱們查找splitLongParameters,發現了其在類開頭已經定義了

 
  1. private static final boolean splitLongParameters = PropUtil

  2.            .getBooleanSystemProperty("mail.mime.splitlongparameters", true);

大體意思就是,編碼後的文件名長度若是大於60而且splitLongParameters的值爲true,encodeParameters的值爲true,文件名就會被截取,想一想編碼後的值被截取是什麼樣子?也只能是文章開頭截圖的顯示了。

最終的解決方案就是,在發送的時候初始化splitLongParameters爲false不截取:

 
  1. static {

  2.         System.setProperty("mail.mime.splitlongparameters","false");

  3.    }

相關文章
相關標籤/搜索