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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大内老A

[WCF权限控制]利用WCF自定义授权模式提供当前Principal[原理篇]

在《通过扩展自行实现服务授权》一文中,我通过自定义CallContextInitializer的方式在操作方法之前之前根据认证用户设置了当前线程的安全主体,从而...

2028
来自专栏码洞

Lettuce快速入门

最近在开发一个使用Redis协议包装HBase的Proxy服务器,一路写的很顺,客户端使用redis-py提供的execute_command方法也轻松搞定。但...

3631
来自专栏Android-JessYan

你不知道的Retrofit缓存库RxCache前言简介使用详解总结

2032
来自专栏一“技”之长

iOS 单例设计模式解读 原

      顾名思义,单例,即是在整个项目中,这个类的对象只能被初始化一次。它的这种特性,可以广泛应用于某些需要全局共享的资源中,比如管理类,引擎类,也可以通过...

902
来自专栏技术点滴

程序异常分析指南一、非法内存访问二、资源访问冲突三、程序异常解决方法总结参考资料

在Linux上编写运行C语言程序,经常会遇到程序崩溃、卡死等异常的情况。程序崩溃时最常见的就是程序运行终止,报告Segmentation fault (core...

5523
来自专栏小小挖掘机

一文读懂Python多线程

1、线程和进程 计算机的核心是CPU,它承担了所有的计算任务。它就像一座工厂,时刻在运行。 ? 假定工厂的电力有限,一次只能供给一个车间使用。也就是说,一个车间...

3945
来自专栏程序员同行者

django rest framework serializers解读

serializers.fieild 我们知道在django中,form也有许多field,那serializers其实也是drf中发挥着这样的功能。我们...

1991
来自专栏Play & Scala 技术分享

Play Scala 2.5.x - Play with MongoDB 开发指南

3385
来自专栏iKcamp

翻译 | 带你秒懂内存管理 - 第一部(共三部)

原文地址:A crash course in memory management 原文作者:Lin Clark 译者:黑黑 校对者:Bob 要理解为什么将 Ar...

2127
来自专栏架构师之旅

Google Protocol Buffer 的使用和原理

什么是 Google Protocol Buffer? 假如您在网上搜索,应该会得到类似这样的文字介绍:

1253

扫码关注云+社区

领取腾讯云代金券