前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SpringBoot开发案例之mail中文附件乱码

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

作者头像
小柒2012
发布2018-04-13 11:49:52
1.7K0
发布2018-04-13 11:49:52
举报
文章被收录于专栏:IT笔记IT笔记

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

1.png
1.png

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

代码语言:javascript
复制
helper.addAttachment(MimeUtility.encodeText(fileName), file);

并且对文件名称加了转码:

代码语言:javascript
复制
MimeUtility.encodeText(attachmentFilename)

但是,如果你跟进源码会发现spring已经为你做了转码工作,所以这个问题不存在的。

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

代码语言:javascript
复制
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,发现了其在类开头已经定义了

代码语言:javascript
复制
private static final boolean splitLongParameters = PropUtil
            .getBooleanSystemProperty("mail.mime.splitlongparameters", true);

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

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

代码语言:javascript
复制
static {
         System.setProperty("mail.mime.splitlongparameters","false");
    }
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-09-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档