base64解密后乱码_血泪教训!记一个JavaMail 附件乱码的问题

01fd30c2578fbe317ab774ab88a8aad1.png
说到乱码,很多人都遇到过,“哎呀,你这个编码是不是UTF-8!”,“你这个会不会操作系统不一致导致的?”,“肯定是两边编码不一致”。不过我们今天说的问题,还真不是这个问题导致的。

问题

用JavaMail 发邮件,带上附件,闪电邮客户端收到后,附件名有时乱码,有时非乱码。查看Java端代码:

String name = MimeUtility.encodeText(name, null) + ".xlsx";messageBodyPart.setFileName(name);

貌似已经做过编码转换了。
令人感到奇怪的是,稍微改变附件名,乱码就消失了。

发现

收集各种信息的时候,突然发现 Ubuntu的小伙伴 在 ThunderBird下收邮件表示没有异常,Mac党表示自带的邮件工具收件也没有问题。那是不是操作系统字符编码问题呢? 可是遗憾的是,在corp 邮箱网页版上,依旧是乱码。 这时候初步怀疑是邮件系统不兼容的问题了,来看邮件源码:

Content-Type: application/octet-stream; name*0="=?utf-8?B?6L+Q6JCl5ZGo5oql576O5a655b2p5aaG5YmN5Y+w5Y2V5ZOB6Z"; name*1="SA5ZSu?=.xls"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename*0="=?utf-8?B?6L+Q6JCl5ZGo5oql576O5a655b2p5aaG5YmN5Y+w5Y2V5ZOB6Z"; filename*1="SA5ZSu?=.xls"

这串就是 有些系统乱码有些系统 正常显示的 邮件源码。。
对比在闪电邮上的非乱码邮件:

Content-Type: application/octet-stream; name="=?utf-8?B?5rWL6K+V?=.xlsx"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="=?utf-8?B?5rWL6K+V?=.xlsx"

filename0,filename1 和 filename 的区别,猜测也许就是闪电邮这个客户端不支持这种filename0,filename1 协议导致的问题。

分析

有了以上的想法,就开始来看源码。
MimeBodyPart 这个类中的 setFileName 方法 用到一个 ParameterList 在ParameterList 的 toString 类中找到下面一段:

if (v instanceof MultiValue) {// ....ns = name + i + "*";//...}} else if (v instanceof Value) {/// ...} else {if (value.length() > 60 &&splitLongParameters && encodeParameters) {int seg = 0;name += "*";/// ....}

这个类在邮件附件属于 MultiValue 会把 名字用name + i 隔开 ,在名字大于 60个字符的时候也会主动截断,这也就是 javamail 中 附件的命名规则,名字太长会被截断~~!
中文在base64 加密后,超过60个字符那是妥妥的有可能。这种截断文件名的模式在某些客户端,比如闪电邮中,并不能很好的支持。

解决

解决就很容易了, 代码里有 splitLongParameters 这个参数, 观察了下 对应于一个环境变量,如果想不截断文件名,只要在程序运行之初加上:

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

就可以了。测试,解决。。。
另外由于发现了这个问题,google到了 java mail 的完整配置,
JAVA Mail System 环境变量 https://docs.oracle.com/javaee/6/api/javax/mail/internet/package-summary.html 包括是否自动编码等配置,曾经没怎么关注过。

总结

邮件系统的不兼容是导致这个错误的根本原因,还真不是编码问题,所以有的时候看问题还不能那么想当然。这个测试未必能测出,毕竟要满足名字足够长这个条件。在这里分享这个问题,以免JAVA党同学重复踩坑哦~

d102d0a73929c057d0af1a004d767968.png

看到这里的小伙伴,如果你喜欢这篇文章的话,别忘了转发、收藏、留言互动!
如果对文章有任何问题,欢迎在留言区和我交流~
最近我新整理了一些资料,包含面经分享、模拟试题、和视频干货,如果你需要的话,欢迎私信我~

8f9fa0ad5d01253f32a17c641ea83190.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/555376.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

最新电脑版二级计算机视频怎么打开,电脑版钉钉如何打开视频会议中录制的视频...

电脑版钉钉如何打开视频会议中录制的视频腾讯视频/爱奇艺/优酷/外卖 充值4折起电脑版钉钉软件被很多人使用,用来学习或者工作,想要聚集一些人讨论问题,因此会开视频会议,那么为了能够后期看视频会议,因此会选择录制视频…

POI 单元格类型CellType

1. 单元格类型 单元格的内容决定了单元格的类型,POI中定义的7种单元格类型: 日期数据对应的单元格类型是CellType.NUMERIC,默认以浮点型数显示,显示为日期格式需要设置单元格样式DataFormat字符型单元格内容也可以为富文本Ric…

extjs 渲染之前的方法_Unity通用渲染管线(URP)系列(十一)——后处理(Bloom)...

200篇教程总入口,欢迎收藏:放牛的星星:[教程汇总持续更新]Unity从入门到入坟——收藏这一篇就够了​zhuanlan.zhihu.com本文重点内容:1、创建简单的post-FX栈2、修改渲染后的图像3、需要的时候完成后处理的呈现4、制作Bloom的效果…

服务器需要指定dns吗,Windows Server2012 安装配置DNS服务器方法详解

在云服务器 Windows Server2012 上安装配置DNS服务器方法,安装与配置非常简单,在这里写个完整教程方便大家查询一、安装DNS服务器1.打开服务器管理器,点击添加角色和功能2.一直下一步,选择基于角色或基于功能的安装3.选择目标服务…

SVN提交时出现locked错误解决办法

问题:在SVN中执行 commit 操作时,在更新过程中,中断过,或者因为其他原因导致SVN 出现 locked 异常。 解决方法: 回到SVN文件夹的根目录。如图操作: 点击ok就好了。

windows7系统做文件服务器拒绝,Win7提示qq服务器拒绝了您发送离线文件

腾讯QQ功能强大,语音、视频、传输文件等,很多人都喜欢通过qq给朋友或同事发送文件,即使人不在也可以接收离线文件,随时都可以接收。但是有win7用户发送离线文件时提示“服务器拒绝了您发送离线文件”,该如何解决此问题…

.net bitmap rgb数据_Python商务与经济统计学-数据描述

案例2-1、3-1 Pelican 商店本案例之中主要涉及到Pandas和pyecharts的一些功能,比如利用pandas进行数据筛选,百分比频数统计,将数据进行分组,分组统计,相关性分析等。另外还涉及到了pyecharts的饼图,直方图&…

qq服务器只保留7天文件吗,qq离线文件服务器上的离线文件能保留几天(一般7天)?...

相信大家都用过qq离线文件功能来跟好友发送离线文件。因为当对方不在线的时候也是可以使用发送离线文件功能。那么在我们发送的qq离线文件服务器上的离线文件能保留几天?因为我们发送的qq离线文件会自动保存在离线文件。它是有一定的时间期限。如果没有期限的话&…

失败的人生图片_人到中年,做事失败了,很可能是遇到了以下五种情况

人至中年,也到了迈入成功大门的时刻,但并非每个人都能在中年获得成功,相反,有不少人却在中年的时候失败。人至中年面临失败,其实原因有很多,但大多数情况下,可能是遇到了以下五种情况。究竟有哪…

Idea的debug断点调试

关于Idea的debug模式下线程断点的总结: 断点介绍: 如图所示,断点可以为所有断点和线程断点,每种断点还可以设置条件,条件满足时才会进入该断点。 1.当设置为All的时候 点击下发的下拉框,可以看到此时拦截…

ajax 传字符串到后台,JSON.stringify()将JSON对象转换为字符串通过Ajax传入到后台处理...

搜索热词最近在做一个小小的功能模块,前台有很多的数据需要传入到后台,前台页面设计如下:看起来不是很清楚,总之表单中的数据都要提交到后台进行处理,然后插入到数据库,而且是一起提交到后台的,…

lan pci 联想开机_微软承认KB4568831导致部分联想ThinkPad笔记本崩溃和蓝屏

在上周末悄然发布的支持文档中,微软承认 KB4568831 以及之后发布的累积更新导致部分联想 ThinkPad 笔记本出现了系统崩溃和蓝屏问题。其中关键错误包括“SYSTEM_THREAD_EXCEPTION_NOT_HANDLED” 崩溃,0xc0000005访问被拒绝,以及进程 ldiagio.…

dropdownlist ajax联动,asp.net省市三级联动的DropDownList+Ajax的三种框架(aspnet/Jquery/ExtJs)示例...

本文主要列举了省市三级联动的DropDownListAjax的三种框架(aspnet/Jquery/ExtJs)示例。前段时间需要作一个的Web前端应用,需要用多个框架,一个典型的应用场景是省市三级联动,基于此应用,特将三种主要的ajax框架略作整理&#xff0…

苹果笔记本电脑亮度无法调节_苹果MacBook AirM1评测:M1芯片给您不一样的体验

哈喽,您好!我是原呵呵,点点关注吧,更多精彩内容等着您M1 MacBook Air是一款神奇的笔记本电脑。不是因为它看起来特别新。这是一个奇迹,虽然它从外观上跟以前看起来没啥区别。它与以前运行相同的操作系统,并…

POI读取Excel文件时,row.getCell(0).getStringCellValue()报错:数字转换异常

在进行关键字驱动测试框架的搭建时,我们可能会遇到当单元格里的内容是手机号或者密码等数字时使用row.getCell(0).getStringCellValue()这个方法是会报错的,因为这牵扯到方法过时的原因: 所以我们可以使用以下的方法解决这个问题&#xff1a…

wps合并所有sheet页_表格高级筛选、表格合并,让表格处理事半功倍

今天给大家介绍WPS最受欢迎的2个表格功能,表格合并和表格高级筛选。这都是能够切实让工作事半功倍的功能,一定要掌握哦!一、表格合并当我们有多个表格的内容需要合并到一个表格中,很多人会采取复制粘贴的方式。表格数量少时可能影…

Java代理设计模式(Proxy)的具体实现:静态代理和动态代理

Java代理设计模式(Proxy)的具体实现:静态代理和动态代理 实现方式一:静态代理静态代理方式的优点静态代理方式的缺点Java动态代理实现方式一:InvocationHandlerJava动态代理实现方式二:CGLIB用CGLIB实现Java动态代理的局限性 面…

golang 大数据平台_大数据平台是什么?有哪些功能?如何搭建大数据平台?

大数据平台是为了满足企业对于数据的各种要求而产生的。大数据平台:是指以处理海量数据存储、计算及不间断流数据实时计算等场景为主的一套基础设施。典型的包括Hadoop系列、Spark、Storm、Flink以及Flume/Kafka等集群。既可以采用开源平台,也可以采用华…

Spring 官方证实:框架爆大漏洞,JDK 9 及以上版本均受影响

继 Log4j 2 之后,听闻 Java 再次遭到漏洞攻击,这一次,似乎情况也更为严重,因为受到影响的是 Java 平台的开源全栈应用程序框架和控制反转容器实现——Spring 家族,而且网传漏洞还不止一个。 一直以来,Spri…

有关家居产品设计的外国专著_为啥外国的二手家具被称为vintage,中国就叫破烂?差在哪儿了?...

如果你细细观察国外的家居市场,发现跳蚤市场特别流行于各个国家。无论是美国、英国、法国,一些普通民众需要购买家具会优先考虑去跳蚤市场看看。所谓的跳蚤市场就是我们国内俗称的二手家具市场,在国人眼中就如同破烂一般存在。而在国外人心中…