SpringBoot开发案例之mail中文附件乱码

前一段时间作过一个邮件发送的服务,之前大致都测试过,文本、图片、附件都是没有问题的,可有同事反应发送的附件名称有中文乱码

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

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

而且对文件名称加了转码:编码

 
  1. MimeUtility.encodeText(attachmentFilename)spa

可是,若是你跟进源码会发现spring已经为你作了转码工做,因此这个问题不存在的。code

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

 
  1. if ((value.length() > 60) && (splitLongParameters)get

  2.                        && (encodeParameters)) {源码

  3.                    int seg = 0;string

  4.                    name = name + "*";it

  5.                    while (value.length() > 60) {

  6.                        sb.addNV(name + seg, quote(value.substring(0, 60)));

  7.                        value = value.substring(60);

  8.                        ++seg;

  9.                    }

  10.                    if (value.length() > 0)

  11.                        sb.addNV(name + seg, quote(value));

  12.                } else {

  13.                    sb.addNV(name, quote(value));

  14.                }

上面这段代码的逻辑,你们应该能够很清晰的理解了吧,你们能够发现若是value.length() > 60 而且 splitLongParameters?哎,问题来了,splitLongParameters究竟是个什么值,咱们查找splitLongParameters,发现了其在类开头已经定义了

 
  1. private static final boolean splitLongParameters = PropUtil

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

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

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

 
  1. static {

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

  3.    }

相关文章
相关标签/搜索