Java发送邮件Excel附件名称变为.dat文件

2024-02-20 00:32

本文主要是介绍Java发送邮件Excel附件名称变为.dat文件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Java编写发送邮件,并且添加Excel文件作为附件,邮件可以发送成功,但是附件名称似乎有些问题,总是变成ATT_*****.dat文件,在网上找了许多资料,参考了一些大神的方法,终于解决了该问题。

这用到的邮件类是MultiPartEmail,进入该类的attach方法:

public MultiPartEmail attach(final DataSource ds,String name,final String description,final String disposition)throws EmailException{if (EmailUtils.isEmpty(name)){name = ds.getName();}final BodyPart bodyPart = createBodyPart();try{bodyPart.setDisposition(disposition);bodyPart.setFileName(MimeUtility.encodeText(name));bodyPart.setDescription(description);bodyPart.setDataHandler(new DataHandler(ds));getContainer().addBodyPart(bodyPart);}catch (final UnsupportedEncodingException uee){// in case the filename could not be encodedthrow new EmailException(uee);}catch (final MessagingException me){throw new EmailException(me);}setBoolHasAttachments(true);return this;}

接下来看看setFileName方法,这里进入的是Part接口的一个实现类MimeBodyPart中的setFileName方法

static void setFileName(MimePart part, String name) throws MessagingException {if (encodeFileName && name != null) {try {name = MimeUtility.encodeText(name);} catch (UnsupportedEncodingException ex) {throw new MessagingException("Can't encode filename", ex);}}// Set the Content-Disposition "filename" parameterString s = part.getHeader("Content-Disposition", null);ContentDisposition cd = new ContentDisposition(s == null ? Part.ATTACHMENT : s);// ensure that the filename is encoded if necessaryString charset = MimeUtility.getDefaultMIMECharset();ParameterList p = cd.getParameterList();if (p == null) {p = new ParameterList();cd.setParameterList(p);}if (encodeFileName)p.setLiteral("filename", name);elsep.set("filename", name, charset);part.setHeader("Content-Disposition", cd.toString());/** Also attempt to set the Content-Type "name" parameter,* to satisfy ancient MUAs.  XXX - This is not RFC compliant.*/if (setContentTypeFileName) {s = part.getHeader("Content-Type", null);s = MimeUtil.cleanContentType(part, s);if (s != null) {try {ContentType cType = new ContentType(s);// ensure that the filename is encoded if necessaryp = cType.getParameterList();if (p == null) {p = new ParameterList();cType.setParameterList(p);}if (encodeFileName)p.setLiteral("name", name);elsep.set("name", name, charset);part.setHeader("Content-Type", cType.toString());} catch (ParseException pex) { }	// ignore it}}}

方法内部使用了ParameterList类,这个类的toString方法中有这样一段

if (value.length() > 60 &&splitLongParameters && encodeParameters) {int seg = 0;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));}

如果长度超过60,并后面两个值为true,方法内部会将值进行切分。查看该类代码,不难发现这两个值是环境变量,如果不设定则默认值未true,而文件名经过64位编码后很容易超长,因此最终的文件名被切分。

splitLongParameters这个环境变量可以看出是用来切割超长参数的,最终的解决的办法就是在程序启动时将改变量值设置为false,这样文件名就不会被切分。在SpringBoot的启动类或者程序的启动监听类中添加如下代码,再尝试发送邮件中的附件名就正常了。

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

本文借鉴https://blog.csdn.net/wty19/article/details/50607411,感谢原博主!

这篇关于Java发送邮件Excel附件名称变为.dat文件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/726488

相关文章

Java实现在Word文档中添加文本水印和图片水印的操作指南

《Java实现在Word文档中添加文本水印和图片水印的操作指南》在当今数字时代,文档的自动化处理与安全防护变得尤为重要,无论是为了保护版权、推广品牌,还是为了在文档中加入特定的标识,为Word文档添加... 目录引言Spire.Doc for Java:高效Word文档处理的利器代码实战:使用Java为Wo

SpringBoot日志级别与日志分组详解

《SpringBoot日志级别与日志分组详解》文章介绍了日志级别(ALL至OFF)及其作用,说明SpringBoot默认日志级别为INFO,可通过application.properties调整全局或... 目录日志级别1、级别内容2、调整日志级别调整默认日志级别调整指定类的日志级别项目开发过程中,利用日志

Java中的抽象类与abstract 关键字使用详解

《Java中的抽象类与abstract关键字使用详解》:本文主要介绍Java中的抽象类与abstract关键字使用详解,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、抽象类的概念二、使用 abstract2.1 修饰类 => 抽象类2.2 修饰方法 => 抽象方法,没有

SpringBoot 多环境开发实战(从配置、管理与控制)

《SpringBoot多环境开发实战(从配置、管理与控制)》本文详解SpringBoot多环境配置,涵盖单文件YAML、多文件模式、MavenProfile分组及激活策略,通过优先级控制灵活切换环境... 目录一、多环境开发基础(单文件 YAML 版)(一)配置原理与优势(二)实操示例二、多环境开发多文件版

Spring 中的切面与事务结合使用完整示例

《Spring中的切面与事务结合使用完整示例》本文给大家介绍Spring中的切面与事务结合使用完整示例,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录 一、前置知识:Spring AOP 与 事务的关系 事务本质上就是一个“切面”二、核心组件三、完

Java实现远程执行Shell指令

《Java实现远程执行Shell指令》文章介绍使用JSch在SpringBoot项目中实现远程Shell操作,涵盖环境配置、依赖引入及工具类编写,详解分号和双与号执行多指令的区别... 目录软硬件环境说明编写执行Shell指令的工具类总结jsch(Java Secure Channel)是SSH2的一个纯J

JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法

《JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法》:本文主要介绍JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法,每种方法结合实例代码给大家介绍的非常... 目录引言:为什么"相等"判断如此重要?方法1:使用some()+includes()(适合小数组)方法2

SpringBoot 获取请求参数的常用注解及用法

《SpringBoot获取请求参数的常用注解及用法》SpringBoot通过@RequestParam、@PathVariable等注解支持从HTTP请求中获取参数,涵盖查询、路径、请求体、头、C... 目录SpringBoot 提供了多种注解来方便地从 HTTP 请求中获取参数以下是主要的注解及其用法:1

HTTP 与 SpringBoot 参数提交与接收协议方式

《HTTP与SpringBoot参数提交与接收协议方式》HTTP参数提交方式包括URL查询、表单、JSON/XML、路径变量、头部、Cookie、GraphQL、WebSocket和SSE,依据... 目录HTTP 协议支持多种参数提交方式,主要取决于请求方法(Method)和内容类型(Content-Ty

深度解析Java @Serial 注解及常见错误案例

《深度解析Java@Serial注解及常见错误案例》Java14引入@Serial注解,用于编译时校验序列化成员,替代传统方式解决运行时错误,适用于Serializable类的方法/字段,需注意签... 目录Java @Serial 注解深度解析1. 注解本质2. 核心作用(1) 主要用途(2) 适用位置3