前一段时间做过一个邮件发送的服务,以前大体都测试过,文本、图片、附件都是没有问题的,可有同事反应发送的附件名称有中文乱码,类似如下截图展示:
咋一看不像乱码,抱着试试看的态度,为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 |
大致意思就是,编码后的文件名长度如果大于60并且splitLongParameters的值为true,encodeParameters的值为true,文件名就会被截取,想想编码后的值被截取是什么样子?也只能是文章开头截图的显示了。
最终的解决方案就是,在发送的时候初始化splitLongParameters为false不截取:
1
2
3
|
static { System.setProperty( "mail.mime.splitlongparameters" , "false" ); } |
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://blog.52itstyle.com/archives/1779/?utm_source=tuicool&utm_medium=referral