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

12 篇文章 0 订阅
4 篇文章 0 订阅

项目环境: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 发送邮件附件 文件名过长的坑

Spring Boot提供了简便的方式来配置JavaMailSender,但是如果不使用配置文件,也可以通过编程方式来配置JavaMailSender。 首先,需要在Spring Boot应用程序的配置类或配置文件中创建一个JavaMailSender bean。可以使用JavaMailSenderImpl类作为实现,然后设置相应的属性。 例如,可以创建一个名为EmailConfig的配置类: ```java @Configuration public class EmailConfig { @Bean public JavaMailSender javaMailSender() { JavaMailSenderImpl mailSender = new JavaMailSenderImpl(); mailSender.setHost("smtp.example.com"); // 设置SMTP服务器主机 mailSender.setPort(587); // 设置SMTP服务器端口号 mailSender.setUsername("username"); // 设置用户名 mailSender.setPassword("password"); // 设置密码 Properties props = mailSender.getJavaMailProperties(); props.put("mail.smtp.starttls.enable", "true"); // 启用STARTTLS加密 return mailSender; } } ``` 然后,在需要发送邮件的地方注入JavaMailSender,并使用其send方法发送邮件。 例如,可以创建一个名为EmailService的服务类: ```java @Service public class EmailService { @Autowired private JavaMailSender javaMailSender; public void sendEmail(String to, String subject, String body) { SimpleMailMessage message = new SimpleMailMessage(); message.setTo(to); // 设置收件人 message.setSubject(subject); // 设置邮件主题 message.setText(body); // 设置邮件内容 javaMailSender.send(message); // 发送邮件 } } ``` 然后,在需要发送邮件的地方使用EmailService来发送邮件。 总结来说,不使用配置文件,可以通过编程方式来配置JavaMailSender,并使用它来发送邮件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值