飞道的博客

SpringBoot下使用模板引擎发送邮件(JavaMailSenderImpl)踩坑

1057人阅读  评论(0)

目录

前言

Why What How

总结(重点,防踩坑)


 

前言

如今springboot项目大多是在用yaml文件进行配置,本篇将介绍在Linux,SpringBoot环境下如何使用模板引擎进行发送邮件。这里先给个我之前总结的两点发送邮件的注意事项链接:阿里云服务器上SpringBoot项目发送邮件的配置。昨天一时兴起,想要给我的邮件验证码相关的功能美化一下,然后就给整了个模板引擎上去,做了一个low low的邮件UI,本地(win)测试跑了一下可以没问题,部署到服务器上就没去管了,今天被朋友说注册接口炸了,发送验证码超时。晚上就撸起袖子找bug了。查看日志报了个邮件端口(465)连接超时,我就纳闷了,一番测试后终于解决了问题。下面会详细介绍一下为什么会出现这个问题,这个问题为什么不能在本地重现,以及这个问题是怎么解决的。

Why What How

 之前我写的一个注册功能中有个发送邮箱验证码的验证。一开始没考虑美观性之类的东西,先完成功能再说嘛。使用JavaMailSender发送一个SimpleMailMessage直接就完成功能了。这里附上部分功能代码。
 


  
  1. @Resource
  2. private JavaMailSender javaMailSender;
  3. /**
  4. * 发送邮件
  5. * <p>
  6. * emailDTO 邮件对象(收件人,主题,内容)
  7. *
  8. * @return 响应状态码
  9. */
  10. @Override
  11. public Integer sendEmail(EmailDTO emailDTO) {
  12. try {
  13. SimpleMailMessage mailMessage = new SimpleMailMessage();
  14. mailMessage.setFrom(emailConfig.getUsername());
  15. mailMessage.setTo(emailDTO.getRecipient());
  16. mailMessage.setSubject(emailDTO.getSubject());
  17. mailMessage.setText(emailDTO.getContent());
  18. javaMailSender.send(mailMessage);
  19. } catch (MailException e) {
  20. e.printStackTrace();
  21. return 500;
  22. }
  23. return 200;
  24. }

然后为了能让邮件跟官方和美观,我使用了Spring中的邮件发送类JavaMailSenderImpl和模板引擎SpringTemplateEngine来让我的邮件内容附带一些UI。

  • 在pom文件中我额外引入了thymeleaf模板引擎

  
  1. <dependency>
  2. <groupId>org.thymeleaf </groupId>
  3. <artifactId>thymeleaf-spring5 </artifactId>
  4. <version>3.0.11.RELEASE </version>
  5. </dependency>
  • 在resources/template目录下我创建了一个register.html文件用来替换我的邮件内容

  • 将模板引擎SpringTemplateEngine和邮件发送服务JavaMailSenderImpl注入Spring中


  
  1. @Bean
  2. public SpringTemplateEngine emailTemplateEngine() {
  3. SpringTemplateEngine templateEngine = new SpringTemplateEngine();
  4. ClassLoaderTemplateResolver templateResolver = new ClassLoaderTemplateResolver();
  5. templateResolver.setResolvablePatterns(Collections.singleton( "*.html"));
  6. templateResolver.setPrefix( "/template/");
  7. templateResolver.setSuffix( ".html");
  8. templateResolver.setTemplateMode(TemplateMode.HTML);
  9. templateResolver.setCharacterEncoding( "UTF-8");
  10. templateResolver.setCacheable( false);
  11. templateEngine.addTemplateResolver(templateResolver);
  12. return templateEngine;
  13. }
  14. @Bean
  15. public JavaMailSenderImpl javaMailSenderImpl() {
  16. JavaMailSenderImpl javaMailSenderImpl = new JavaMailSenderImpl();
  17. javaMailSenderImpl.setHost(host);
  18. javaMailSenderImpl.setUsername(username);
  19. javaMailSenderImpl.setPassword(password);
  20. javaMailSenderImpl.setDefaultEncoding(encoding);
  21. javaMailSenderImpl.setPort(port);
  22. Properties properties = new Properties();
  23. //如果连接25端口以外的端口就必须有这个参数设置,且配置文件中的配置需要手动导入到 JavaMailSenderImpl才能在其中使用
  24. properties.put( "mail.smtp.ssl.enable", true);
  25. javaMailSenderImpl.setJavaMailProperties(properties);
  26. return javaMailSenderImpl;
  27. }

一开始我并没有给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
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场