欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2024-03-02 22:25:40
前一段时间做过一个邮件发送的服务,以前大体都测试过,文本、图片、附件都是没有问题的,可有同事反应发送的附件名称有中文乱码,类似如下截图展示: 咋一看不像乱码,抱着...

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

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");
  }

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