閱讀315 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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

前一段時間做過一個郵件發送的服務,以前大體都測試過,文本、圖片、附件都是沒有問題的,可有同事反應發送的附件名稱有中文亂碼,類似如下截圖展示:
1.png

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

helper.addAttachment(MimeUtility.encodeText(fileName), file);

並且對文件名稱加了轉碼:

MimeUtility.encodeText(attachmentFilename)

但是,如果你跟進源碼會發現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,文件名就會被截取,想想編碼後的值被截取是什麼樣子?也隻能是文章開頭截圖的顯示了。

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

static {
         System.setProperty("mail.mime.splitlongparameters","false");
    }

作者: 小柒

出處: https://blog.52itstyle.com

分享是快樂的,也見證了個人成長曆程,文章大多都是工作經驗總結以及平時學習積累,基於自身認知不足之處在所難免,也請大家指正,共同進步。

本文版權歸作者所有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁麵明顯位置給出, 如有問題, 可郵件(345849402@qq.com)谘詢。

最後更新:2017-10-18 09:03:25

  上一篇:go  阿裏雲幸運劵領取和使用方法?
  下一篇:go  阿裏雲服務器安全組設置內網互通的方法