SpringBoot mail中文附件亂碼的解決方法
前一段時間做過一個郵件發(fā)送的服務,以前大體都測試過,文本、圖片、附件都是沒有問題的,可有同事反應發(fā)送的附件名稱有中文亂碼,類似如下截圖展示:
咋一看不像亂碼,抱著試試看的態(tài)度,為MimeMessageHelper硬性加了編碼:
helper.addAttachment(MimeUtility.encodeText(fileName), file);
并且對文件名稱加了轉(zhuǎn)碼:
MimeUtility.encodeText(attachmentFilename)
但是,如果你跟進源碼會發(fā)現(xiàn)spring已經(jīng)為你做了轉(zhuǎn)碼工作,所以這個問題不存在的。
繼續(xù)跟進MimeBodyPart類,發(fā)現(xiàn)setFileName方法中有個ParameterList類,點擊繼續(xù)跟進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)); }
上面這段代碼的邏輯,大家應該可以很清晰的理解了吧,大家可以發(fā)現(xiàn)如果value.length() > 60 并且 splitLongParameters?哎,問題來了,splitLongParameters到底是個什么值,我們查找splitLongParameters,發(fā)現(xiàn)了其在類開頭已經(jīng)定義了
private static final boolean splitLongParameters = PropUtil .getBooleanSystemProperty("mail.mime.splitlongparameters", true);
大致意思就是,編碼后的文件名長度如果大于60并且splitLongParameters的值為true,encodeParameters的值為true,文件名就會被截取,想想編碼后的值被截取是什么樣子?也只能是文章開頭截圖的顯示了。
最終的解決方案就是,在發(fā)送的時候初始化splitLongParameters為false不截?。?/p>
static { System.setProperty("mail.mime.splitlongparameters","false"); }
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
使用java8 API遍歷過濾文件目錄及子目錄和隱藏文件示例詳解
這篇文章主要介紹了使用java8API遍歷過濾文件目錄及子目錄及隱藏文件示例詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-07-07基于Springboot+Mybatis對數(shù)據(jù)訪問層進行單元測試的方式分享
本文將介紹一種快高效、可復用的解決測試方案——對數(shù)據(jù)訪問層做單元測試,文章通過代碼示例介紹的非常詳細,具有一定的參考價值,需要的朋友可以參考下2023-07-07SpringCloud應用idea實現(xiàn)可相互調(diào)用的多模塊程序詳解
IDEA 全稱 IntelliJ IDEA,是java編程語言的集成開發(fā)環(huán)境。IntelliJ在業(yè)界被公認為最好的Java開發(fā)工具,尤其在智能代碼助手、代碼自動提示、重構(gòu)、JavaEE支持、各類版本工具(git、svn等)、JUnit、CVS整合、代碼分析、 創(chuàng)新的GUI設計等方面的功能可以說是超常的2022-07-07Java中Validated、Valid 、Validator區(qū)別詳解
本文主要介紹了Java中Validated、Valid 、Validator區(qū)別,有時候面試的時候會被問到,他們的區(qū)別你知道幾個,本文就來詳細的介紹一下2021-08-08Java深入數(shù)據(jù)結(jié)構(gòu)理解掌握抽象類與接口
在類中沒有包含足夠的信息來描繪一個具體的對象,這樣的類稱為抽象類,接口是Java中最重要的概念之一,它可以被理解為一種特殊的類,不同的是接口的成員沒有執(zhí)行體,是由全局常量和公共的抽象方法所組成,本文給大家介紹Java抽象類和接口,感興趣的朋友一起看看吧2022-05-05Java java.lang.InstantiationException異常案例詳解
這篇文章主要介紹了Java java.lang.InstantiationException異常案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-08-08java.net.SocketTimeoutException: Read timed o
本文主要介紹了java.net.SocketTimeoutException: Read timed out異常的解決,可能是因為網(wǎng)絡延遲、服務器響應慢或連接不穩(wěn)定等原因造成的,下面就一起來介紹一下,感興趣的可以了解一下2024-05-05