• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

SpringBoot mail中文附件乱码的解决方法

springboot 搞代码 4年前 (2022-01-05) 24次浏览 已收录 0个评论

本篇文章主要介绍了SpringBoot mail中文附件乱码的解决方法,非常具有实用价值,需要的朋友可以参考下

前一段时间做过一个邮件发送的服务,以前大体都测试过,文本、图片、附件都是没有问题的,可有同事反应发送的附件名称有中文乱码,类似如下截图展示:

咋一看不像乱码,抱着试试看的态度,为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?哎,问题来了,splitLongP来源gao($daima.com搞@代@#码(网arameters到底是个什么值,我们查找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"); }

以上就是SpringBoot mail中文附件乱码的解决方法的详细内容,更多请关注gaodaima搞代码网其它相关文章!


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:SpringBoot mail中文附件乱码的解决方法

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址