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?哎,问题来了,splitLongParameters到底是个什么值,我们查找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"); }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
相关文章
使用java8 API遍历过滤文件目录及子目录和隐藏文件示例详解
这篇文章主要介绍了使用java8API遍历过滤文件目录及子目录及隐藏文件示例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2020-07-07基于Springboot+Mybatis对数据访问层进行单元测试的方式分享
本文将介绍一种快高效、可复用的解决测试方案——对数据访问层做单元测试,文章通过代码示例介绍的非常详细,具有一定的参考价值,需要的朋友可以参考下2023-07-07SpringCloud应用idea实现可相互调用的多模块程序详解
IDEA 全称 IntelliJ IDEA,是java编程语言的集成开发环境。IntelliJ在业界被公认为最好的Java开发工具,尤其在智能代码助手、代码自动提示、重构、JavaEE支持、各类版本工具(git、svn等)、JUnit、CVS整合、代码分析、 创新的GUI设计等方面的功能可以说是超常的2022-07-07Java中Validated、Valid 、Validator区别详解
本文主要介绍了Java中Validated、Valid 、Validator区别,有时候面试的时候会被问到,他们的区别你知道几个,本文就来详细的介绍一下2021-08-08Java java.lang.InstantiationException异常案例详解
这篇文章主要介绍了Java java.lang.InstantiationException异常案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下2021-08-08java.net.SocketTimeoutException: Read timed o
本文主要介绍了java.net.SocketTimeoutException: Read timed out异常的解决,可能是因为网络延迟、服务器响应慢或连接不稳定等原因造成的,下面就一起来介绍一下,感兴趣的可以了解一下2024-05-05
最新评论