base64解密后乱码_血泪教训!记一个JavaMail 附件乱码的问题
問題
用JavaMail 發郵件,帶上附件,閃電郵客戶端收到后,附件名有時亂碼,有時非亂碼。查看Java端代碼:
String name = MimeUtility.encodeText(name, null) + ".xlsx";messageBodyPart.setFileName(name);貌似已經做過編碼轉換了。
令人感到奇怪的是,稍微改變附件名,亂碼就消失了。
發現
收集各種信息的時候,突然發現 Ubuntu的小伙伴 在 ThunderBird下收郵件表示沒有異常,Mac黨表示自帶的郵件工具收件也沒有問題。那是不是操作系統字符編碼問題呢? 可是遺憾的是,在corp 郵箱網頁版上,依舊是亂碼。 這時候初步懷疑是郵件系統不兼容的問題了,來看郵件源碼:
Content-Type: application/octet-stream; name*0="=?utf-8?B?6L+Q6JCl5ZGo5oql576O5a655b2p5aaG5YmN5Y+w5Y2V5ZOB6Z"; name*1="SA5ZSu?=.xls" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename*0="=?utf-8?B?6L+Q6JCl5ZGo5oql576O5a655b2p5aaG5YmN5Y+w5Y2V5ZOB6Z"; filename*1="SA5ZSu?=.xls"這串就是 有些系統亂碼有些系統 正常顯示的 郵件源碼。。
對比在閃電郵上的非亂碼郵件:
filename0,filename1 和 filename 的區別,猜測也許就是閃電郵這個客戶端不支持這種filename0,filename1 協議導致的問題。
分析
有了以上的想法,就開始來看源碼。
MimeBodyPart 這個類中的 setFileName 方法 用到一個 ParameterList 在ParameterList 的 toString 類中找到下面一段:
這個類在郵件附件屬于 MultiValue 會把 名字用name + i 隔開 ,在名字大于 60個字符的時候也會主動截斷,這也就是 javamail 中 附件的命名規則,名字太長會被截斷~~!
中文在base64 加密后,超過60個字符那是妥妥的有可能。這種截斷文件名的模式在某些客戶端,比如閃電郵中,并不能很好的支持。
解決
解決就很容易了, 代碼里有 splitLongParameters 這個參數, 觀察了下 對應于一個環境變量,如果想不截斷文件名,只要在程序運行之初加上:
System.setProperty("mail.mime.splitlongparameters","false");就可以了。測試,解決。。。
另外由于發現了這個問題,google到了 java mail 的完整配置,
JAVA Mail System 環境變量 https://docs.oracle.com/javaee/6/api/javax/mail/internet/package-summary.html 包括是否自動編碼等配置,曾經沒怎么關注過。
總結
郵件系統的不兼容是導致這個錯誤的根本原因,還真不是編碼問題,所以有的時候看問題還不能那么想當然。這個測試未必能測出,畢竟要滿足名字足夠長這個條件。在這里分享這個問題,以免JAVA黨同學重復踩坑哦~
看到這里的小伙伴,如果你喜歡這篇文章的話,別忘了轉發、收藏、留言互動!
如果對文章有任何問題,歡迎在留言區和我交流~
最近我新整理了一些資料,包含面經分享、模擬試題、和視頻干貨,如果你需要的話,歡迎私信我~
總結
以上是生活随笔為你收集整理的base64解密后乱码_血泪教训!记一个JavaMail 附件乱码的问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: selenium linux 谷歌浏览器
- 下一篇: 51单片机c语言应用开发三位一体实战精讲