springboot JavaMailSender 附件名称变为xxx.dat或者乱码等问题

项目环境:SpringBoot (2.2.5.RELEASE)
接收邮件客户端: foxmail(版本不一)
服务部署方式:docker tomcat 容器

邮件发送简单实现

伪代码思路:

  1. 定义邮件基本信息,主题、发送人、接收人、正文
  2. 根据入参从服务器上获取文件,并添加成邮件附件
File baseDir = null;
try {
    
    
	MimeMessage mimeMessage = javaMailSender.createMimeMessage();
	MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
	helper.setSubject(subject);  // 邮件主题
	helper.setFrom(emailFrom); // 发送人
	helper.setTo(receiver); // 接收人
	// 添加正文
	helper.setText(content, true);
	// 添加附件
	String baseDirPath = String.format("upload/");
	File baseDir = new File(baseDirPath);
	if (baseDir != null && !baseDir.exists()) {
    
    
		baseDir.mkdirs();
	}
	File dlFile = new File(baseDirPath + "/" + dlFileName);
	FileSystemResource file = new FileSystemResource(dlFile);
	helper.addAttachment(dlFileName, file);
	
	helper.setSentDate(DateUtil.date());
	// 发送邮件
	javaMailSender.send(mimeMessage);
} catch (Exception e) {
    
    
	log.warn("发送邮件异常,{}", e);
	throw e;
} 

问题

附件名变为ATT_00001.dat

找了网上一堆解决方案,都说是说附件名称过长(超过60个字符)会产生这个问题,然而本文出现的附件名称未超过60个字符,所以并不是这个问题产生的!

foxmail 版本差异

后来想着,接收邮件的foxmail客户端是不是有版本差异,然后让测试姐姐和开发们都发了一下版本号!真相终于出来啦~ 客户端版本号问题

客户端安装者 版本号
测试小姐姐 7.2 Build9.156
程序媛&&程序猿 7.2.18.95及以上

附件名乱码

这一次附件长度是真的超过60个字符了,按照网上的说法参数mail.mime.splitlongparameters 在linux下 会默认为 true,要将mail.mime.splitlongparameters设置为false

docker tomcat部署 SpringbootApplication 中添加配置无效

激动万分的加了配置,跑了流水线,结果还是有问题!WHY!后来经过大神们的提醒,服务在linux上tomcat容器中部署,不是调用Springboot内嵌的tomcat,所以不会走SpringbootApplication里面的方法。。。

@Slf4j
@SpringBootApplication
@ComponentScan(basePackages={
    
    "com.lizzy"})
public class SpringbootApplication extends SpringBootServletInitializer {
    
    

	public static void main(String[] args) throws UnknownHostException {
    
    
		initProperty();		
		ConfigurableApplicationContext application = SpringApplication.run(SpringbootApplication.class, args);
		// ...
	}

	private static void initProperty() {
    
    
		System.setProperty("mail.mime.splitlongparameters", "false");
	}

在服务启动前加配置 - 静态代码(完美解决)

找个适合的位置,把这段静态代码加上,完美解决问题!

static {
    
    
	// 初始化系统设置
	System.setProperty("mail.mime.splitlongparameters", "false");
}

参考文献

java 发送邮件附件 文件名过长的坑

猜你喜欢

转载自blog.csdn.net/huhui806/article/details/124194594