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

SpringBoot mail中文附件乱码的解决方法,第1张

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

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

咋一看不像乱码,抱着试试看的态度,为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");  }

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

总结

以上是内存溢出为你收集整理的SpringBoot mail中文附件乱码的解决方法全部内容,希望文章能够帮你解决SpringBoot mail中文附件乱码的解决方法所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1230826.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存