目录
前言
如今springboot项目大多是在用yaml文件进行配置,本篇将介绍在Linux,SpringBoot环境下如何使用模板引擎进行发送邮件。这里先给个我之前总结的两点发送邮件的注意事项链接:阿里云服务器上SpringBoot项目发送邮件的配置。昨天一时兴起,想要给我的邮件验证码相关的功能美化一下,然后就给整了个模板引擎上去,做了一个low low的邮件UI,本地(win)测试跑了一下可以没问题,部署到服务器上就没去管了,今天被朋友说注册接口炸了,发送验证码超时。晚上就撸起袖子找bug了。查看日志报了个邮件端口(465)连接超时,我就纳闷了,一番测试后终于解决了问题。下面会详细介绍一下为什么会出现这个问题,这个问题为什么不能在本地重现,以及这个问题是怎么解决的。
Why What How
之前我写的一个注册功能中有个发送邮箱验证码的验证。一开始没考虑美观性之类的东西,先完成功能再说嘛。使用JavaMailSender发送一个SimpleMailMessage直接就完成功能了。这里附上部分功能代码。
-
@Resource
-
private JavaMailSender javaMailSender;
-
-
/**
-
* 发送邮件
-
* <p>
-
* emailDTO 邮件对象(收件人,主题,内容)
-
*
-
* @return 响应状态码
-
*/
-
@Override
-
public Integer sendEmail(EmailDTO emailDTO) {
-
try {
-
SimpleMailMessage mailMessage =
new SimpleMailMessage();
-
mailMessage.setFrom(emailConfig.getUsername());
-
mailMessage.setTo(emailDTO.getRecipient());
-
mailMessage.setSubject(emailDTO.getSubject());
-
mailMessage.setText(emailDTO.getContent());
-
javaMailSender.send(mailMessage);
-
}
catch (MailException e) {
-
e.printStackTrace();
-
return
500;
-
}
-
return
200;
-
}
然后为了能让邮件跟官方和美观,我使用了Spring中的邮件发送类JavaMailSenderImpl和模板引擎SpringTemplateEngine来让我的邮件内容附带一些UI。
- 在pom文件中我额外引入了thymeleaf模板引擎
-
<dependency>
-
<groupId>org.thymeleaf
</groupId>
-
<artifactId>thymeleaf-spring5
</artifactId>
-
<version>3.0.11.RELEASE
</version>
-
</dependency>
-
在resources/template目录下我创建了一个register.html文件用来替换我的邮件内容
-
将模板引擎SpringTemplateEngine和邮件发送服务JavaMailSenderImpl注入Spring中
-
@Bean
-
public SpringTemplateEngine emailTemplateEngine() {
-
SpringTemplateEngine templateEngine =
new SpringTemplateEngine();
-
ClassLoaderTemplateResolver templateResolver =
new ClassLoaderTemplateResolver();
-
templateResolver.setResolvablePatterns(Collections.singleton(
"*.html"));
-
templateResolver.setPrefix(
"/template/");
-
templateResolver.setSuffix(
".html");
-
templateResolver.setTemplateMode(TemplateMode.HTML);
-
templateResolver.setCharacterEncoding(
"UTF-8");
-
templateResolver.setCacheable(
false);
-
templateEngine.addTemplateResolver(templateResolver);
-
return templateEngine;
-
}
-
-
@Bean
-
public JavaMailSenderImpl javaMailSenderImpl() {
-
JavaMailSenderImpl javaMailSenderImpl =
new JavaMailSenderImpl();
-
javaMailSenderImpl.setHost(host);
-
javaMailSenderImpl.setUsername(username);
-
javaMailSenderImpl.setPassword(password);
-
javaMailSenderImpl.setDefaultEncoding(encoding);
-
javaMailSenderImpl.setPort(port);
-
Properties properties =
new Properties();
-
//如果连接25端口以外的端口就必须有这个参数设置,且配置文件中的配置需要手动导入到 JavaMailSenderImpl才能在其中使用
-
properties.put(
"mail.smtp.ssl.enable",
true);
-
javaMailSenderImpl.setJavaMailProperties(properties);
-
return javaMailSenderImpl;
-
}
一开始我并没有给JavaMailSenderImpl配置端口和ssl.enable。因为之前使用JavaMailSender可以直接绑定配置文件中的配置,但是这里JavaMailSenderImpl是需要手动绑定这些配置参数的。由于我一开始没有绑定port和配置ssl.enable导致我本地(win)环境下默认时25端口发送邮件没毛病能发送出来,到了服务器上我配置文件中的465端口配置不生效了,25端口又没开启,一直连接超时。
总结(重点,防踩坑)
使用JavaMailSenderfangcaikengImpl这个类时配置文件中的配置需要手动导入进去才能生效,并且如果连接25端口(发送邮件不配置端口默认都是25端口)以外的端口就必须有mail.smtp.ssl.enable这个参数设置。
转载:https://blog.csdn.net/You_are_my_Mr_Right/article/details/105849828