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

 更新时间:2017年09月26日 16:42:41   作者:小柒  
本篇文章主要介绍了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");
  }

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

相关文章

  • Java超详细教你写一个斗地主洗牌发牌系统

    Java超详细教你写一个斗地主洗牌发牌系统

    这篇文章主要介绍了怎么用Java来你写一个斗地主种洗牌和发牌的功能,斗地主相信大家都知道,同时也知道每一局都要洗牌打乱顺序再发牌,本篇我们就来实现这个功能,感兴趣的朋友跟随文章往下看看吧
    2022-03-03
  • springmvc path请求映射到bean 方法的流程

    springmvc path请求映射到bean 方法的流程

    这篇文章主要介绍了springmvc path请求映射到bean 方法的流程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-07-07
  • java代理模式(jdk proxy)

    java代理模式(jdk proxy)

    代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;这篇文章主要介绍了Java 中的三种代理模式,需要的朋友可以参考下,希望能帮助到你
    2021-07-07
  • JavaWeb开发使用Cookie创建-获取-持久化、自动登录、购物记录、作用路径

    JavaWeb开发使用Cookie创建-获取-持久化、自动登录、购物记录、作用路径

    这篇文章主要介绍了JavaWeb开发使用Cookie创建-获取-持久化、自动登录、购物记录、作用路径的相关知识,非常不错,对cookie持久化知识感兴趣的朋友一起学习吧
    2016-08-08
  • Java如何使用流去除集合中某个字段为空的对象

    Java如何使用流去除集合中某个字段为空的对象

    这篇文章主要给大家介绍了关于Java如何使用流去除集合中某个字段为空的对象,文中通过示例代码介绍的非常详细,对大家学习或者使用Java具有一定的参考学习价值,需要的朋友可以参考下
    2023-08-08
  • Java并发编程中的生产者与消费者模型简述

    Java并发编程中的生产者与消费者模型简述

    这篇文章主要介绍了Java并发编程中的生产者与消费者模型简述,多线程并发是Java编程中最终要的部分之一,需要的朋友可以参考下
    2015-07-07
  • Quarkus中filter过滤器跨域cors问题解决方案

    Quarkus中filter过滤器跨域cors问题解决方案

    这篇文章主要为大家介绍了Quarkus中filter过滤器跨域cors问题的解决方案,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-02-02
  • 利用stream sorted进行降序排序

    利用stream sorted进行降序排序

    这篇文章主要介绍了利用stream sorted进行降序排序,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • 图文浅析Java序列化和反序列化

    图文浅析Java序列化和反序列化

    序列化(Serialization)是将对象的状态信息转化为可以存储或者传输的形式的过程,下面这篇文章主要给大家介绍了关于Java序列化和反序列化的相关资料,需要的朋友可以参考下
    2021-05-05
  • Springboot自动扫描包路径来龙去脉示例详解

    Springboot自动扫描包路径来龙去脉示例详解

    这篇文章主要介绍了Springboot自动扫描包路径来龙去脉示例详解,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12

最新评论