邮件生成.vnd.openxmlformats-officedocument.spreadsheetml.sheet的bug附件

先说一说产生的bug

在这里插入图片描述
这个为邮件附件的中的文件,应该是xxx.xlsx类型文件结果出现了这个。

 File file = new File("网络测试厂商邮件附件发送问题" + ".xlsx");
 //使用easyExcel生成excel
 EasyExcel.write(file)
                .head(head)
                .sheet(sheetName)
                .doWrite(body);
 //创建MimeMessage
 MimeMessage message = mailSender.createMimeMessage();
 //设置helper编码以及添加文件名,以及文件
 MimeMessageHelper helper = new MimeMessageHelper(message, true, "UTF-8");
 helper.setFrom(from, "测试");
 helper.setTo(toAddresses);
 helper.setSubject(subject);
 helper.setText(content, isHtml);
 helper.addAttachment(MimeUtility.encodeText(file.getName()), file);   
 //发送邮件
 mailSender.send(message);   
 //删除临时文件
 file.delete();

这是整个发送邮件的过程当然中间少删减了许多数据效验的过程也整合了在不同文件下的代码,也删除了try catch 和log。
其中excel的文件生产是通过EasyExcel来创建的对于excel的导出比poi简洁了许多如果对于excel导出非常推荐大家使用EasyExcel能够使得开发非常快捷,其中参数file代表文件,head代表excel文件头,sheetName当然是seet的标题了,body是写入的数据。如果需要使用的话大家搜索EasyExcal的API就可以了。
邮件的发送是通过java.mail来发送的。

分析一下bug可能产生的原因

因为这个bug在发送的邮件附件中只有一个对应的excel会出现这样的问题,所以,最初分析可能是因为数据原因导致文件生成错误,但是在浏览器页面可以直接导出,说明数据也没问题,然后分析比对了一下代码,代码发现并没有什么不同只是一个直接导出,一个是生成文件,然后通过mail去发送。然后只好加了大量log日志,debug调试发现本地生成没问题,测试服务器本地也没问题,那么就是邮件发送出现了问题,这个是在本地复现不了的,只有测试和线上有这个问题,所以不太好解决,想要测试只能发布测试环境后再去验证,由于出现了vnd.openxmlformats-officedocument.spreadsheetml.sheet的bug附件根据这一串很显然这是xlsx文件的contentype后面的文件类型定义,所以首先怀疑是没有指定文件类型导致的,然后根据这个错误附件名称百度搜索一丝类似的bug解决方案都没有,当然我把文件名称过长导致文件附件名乱码下意识忽略了,因为我这也不是乱码这个错误附件名称很容易有误导性,所以经过大量创建测试最终确认是由于附件名称过长导致的,因为之前超过10个中文字符的附件名称几乎没有,所以搜索名称过长导致文件不可用的解决方案,最后修改了一下代码

File file = new File("网络测试厂商邮件附件发送问题" + ".xlsx");
 //使用easyExcel生成excel
 EasyExcel.write(file)
                .head(head)
                .sheet(sheetName)
                .doWrite(body);
 //不启用邮件附件名称过长截取附件名称
 System.getProperties().setProperty("mail.mime.splitlongparameters", "false");
 //创建MimeMessage
 MimeMessage message = mailSender.createMimeMessage();
 //设置helper编码以及添加文件名,以及文件
 MimeMessageHelper helper = new MimeMessageHelper(message, true, "UTF-8");
 helper.setFrom(from, "测试");
 helper.setTo(toAddresses);
 helper.setSubject(subject);
 helper.setText(content, isHtml);
 //helper.addAttachment(MimeUtility.encodeText(file.getName()), file);  
 helper.addAttachment(MimeUtility.encodeWord(file.getName(),"utf-8","B"),file); 
 //发送邮件
 mailSender.send(message);   
 //删除临时文件
 file.delete();

作为一个菜鸟只能添加System.getProperties().setProperty(“mail.mime.splitlongparameters”, “false”);
把helper.addAttachment(MimeUtility.encodeText(file.getName()), file);换成
helper.addAttachment(MimeUtility.encodeWord(file.getName(),“utf-8”,“B”),file); 去试一试了毕竟这个bug困扰了我很久然而发现部署后正常了,最终在项目上线前一天把这个bug解决了,我作为一只菜鸟只能庆幸bug修复了不用在项目上线后延期修复了。
我只是提供了一个以后出现了该bug的搜索标题。
想要具体的原理解决方案可以去寻找邮件附件名称过长,或者为中文导致附件不可用的类似文章去解决。
我也明白了百度后的解决方案与自己的bug如果不相同那么多试试那些自己实现类似功能中会出现的bug的解决方案可能自己的bug可能就能解决,当然这是个笨方法,所以欢迎大佬指点一下我开发过程中出现的bug有什么能够快速定位,修复bug的好方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值