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

2025-05-29 0 20

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

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

咋一看不像乱码,抱着试试看的态度,为MimeMessageHelper硬性加了编码:

?

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

并且对文件名称加了转码:

?

1
MimeUtility.encodeText(attachmentFilename)

但是,如果你跟进源码会发现spring已经为你做了转码工作,所以这个问题不存在的。

继续跟进MimeBodyPart类,发现setFileName方法中有个ParameterList类,点击继续跟进ParameterList类,里面的toString方法:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14
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,发现了其在类开头已经定义了

?

1

2
private static final boolean splitLongParameters = PropUtil

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

大致意思就是,编码后的文件名长度如果大于60并且splitLongParameters的值为true,encodeParameters的值为true,文件名就会被截取,想想编码后的值被截取是什么样子?也只能是文章开头截图的显示了。

最终的解决方案就是,在发送的时候初始化splitLongParameters为false不截取:

?

1

2

3
static {

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

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持快网idc。

原文链接:https://blog.52itstyle.com/archives/1779/?utm_source=tuicool&utm_medium=referral

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 SpringBoot mail中文附件乱码的解决方法 https://www.kuaiidc.com/114355.html

相关文章

发表评论
暂无评论