当前位置:   article > 正文

SpringBoot集成邮件_springboot email test-connection

springboot email test-connection

发送邮件常用的有163邮箱,qq邮箱,其中发送邮件的协议叫SMTP,接收邮件的协议叫POP3/IMAP,IMAP协议比POP3更强大,不过我们不需要要关注,因为服务器集成邮件只会涉及到发送邮件,一般不涉及接收邮件。

我们已163邮箱为例来讲解,首先要开通允许客户端发送邮件的功能

登录进163邮箱后,点击设置

 选择开启服务,下面两个随便哪个都可以,点击开启后会提示扫码发送短信,发完短信会显示授权码, 这个授权码只会显示一次,要记录下来,后面会用到

 接下来就是代码阶段了

1.引入依赖

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-mail</artifactId>
  4. </dependency>

2.加入配置

  1. spring:
  2. mail:
  3. #smtp服务主机 qq邮箱则为smtp.qq.com
  4. host: smtp.163.com
  5. port: 465 #端口不要使用默认的25,阿里云无法开通这个端口,使用465
  6. protocol: smtps
  7. # 编码集
  8. default-encoding: UTF-8
  9. #发送邮件的账户
  10. username: xxxxxxx@163.com
  11. #授权码
  12. password: xxxxxx
  13. test-connection: true
  14. properties:
  15. mail:
  16. smtp:
  17. auth: true
  18. starttls:
  19. enable: true
  20. required: true

3.发送纯文本邮件

  1. @Service
  2. public class EmailService {
  3. @Value("${spring.mail.username}")
  4. private String from;
  5. @Autowired
  6. private JavaMailSender mailSender;
  7. /**
  8. * 发送纯文本邮件
  9. *
  10. * @param tos 接收方
  11. * @param subject 主题
  12. * @param content 邮件内容
  13. * @return
  14. */
  15. public void sendTxtMail(String[] tos, String subject, String content) {
  16. //创建简单邮件消息
  17. SimpleMailMessage message = new SimpleMailMessage();
  18. message.setFrom(from);
  19. message.setTo(tos);
  20. message.setSubject(subject);
  21. message.setText(content);
  22. try {
  23. mailSender.send(message);
  24. } catch (MailException e) {
  25. e.printStackTrace();
  26. throw new ServiceFailException("发送邮件失败", e);
  27. }
  28. }
  29. }

4.发送带html格式的邮件

  1. public void sendHtmlEmail(String[] tos, String subject, String html) {
  2. try {
  3. //创建一个MINE消息
  4. MimeMessage message = mailSender.createMimeMessage();
  5. MimeMessageHelper minehelper = new MimeMessageHelper(message, true);
  6. minehelper.setFrom(from);
  7. minehelper.setTo(tos);
  8. minehelper.setSubject(subject);
  9. //邮件内容 true 表示带有附件或html
  10. minehelper.setText(html, true);
  11. mailSender.send(message);
  12. } catch (Exception e) {
  13. throw new ServiceFailException("发送邮件失败", e);
  14. }
  15. }

5.发送带附件的邮件

由于发送附件的时间较长,所有我们用@Async注解做成异步的,SpringBoot的异步线程只有一个,所以并发量大的话会有延迟,有条件的话可以把发送邮件的任务放入MQ,然后从MQ中取出再执行。需要注意的是发送Multipart不能异步,因为Multipart文件在上传时会创建一个临时文件,一旦请求结束这个文件就会被删除

  1. /**
  2. * 发送带附件的邮件,附件格式为Multipart
  3. *
  4. * @param tos
  5. * @param subject
  6. * @param html
  7. * @param files
  8. */
  9. public void sendMultipartEmail(String[] tos, String subject, String html, List<MultipartFile> files) {
  10. List<File> list = new ArrayList<>();
  11. List<ResourceBean> resourceBeans = new ArrayList<>();
  12. if (CollectionUtils.isNotEmpty(files)) {
  13. for (MultipartFile multipartFile : files) {
  14. //把multipart转成file
  15. Optional<File> optionalFile = FileUtils.multipartFileToFile(multipartFile);
  16. //存在则放入list
  17. optionalFile.ifPresent(file -> {
  18. list.add(file);
  19. resourceBeans.add(new ResourceBean(new FileSystemResource(file), multipartFile.getOriginalFilename()));
  20. });
  21. }
  22. }
  23. sendResourceEmail(tos, subject, html, resourceBeans);
  24. //发送完删除临时文件
  25. for (File file : list) {
  26. file.delete();
  27. }
  28. }
  29. /**
  30. * 发送带附件的邮件,File格式
  31. *
  32. * @param tos
  33. * @param subject
  34. * @param html
  35. * @param files
  36. */
  37. @Async
  38. public void sendHtmlEmail(String[] tos, String subject, String html, List<File> files) {
  39. List<ResourceBean> resourceBeans = files.stream().map(file -> new ResourceBean(new FileSystemResource(file), file.getName())).collect(Collectors.toList());
  40. sendResourceEmail(tos, subject, html, resourceBeans);
  41. }
  42. private void sendResourceEmail(String[] tos, String subject, String html, List<ResourceBean> resourceBeans) {
  43. //创建一个MINE消息
  44. MimeMessage message = mailSender.createMimeMessage();
  45. try {
  46. MimeMessageHelper helper = new MimeMessageHelper(message, true);
  47. helper.setFrom(from);
  48. helper.setTo(tos);
  49. helper.setSubject(subject);
  50. //邮件内容 true 表示带有附件或html
  51. helper.setText(html, true);
  52. if (CollectionUtils.isNotEmpty(resourceBeans)) {
  53. for (ResourceBean resourceBean : resourceBeans) {
  54. //添加附件
  55. helper.addAttachment(resourceBean.getFilename(), resourceBean.getResource());
  56. }
  57. }
  58. mailSender.send(message);
  59. } catch (Exception e) {
  60. throw new ServiceFailException("发送邮件失败", e);
  61. }
  62. }
  63. @Getter
  64. @Setter
  65. @AllArgsConstructor
  66. static class ResourceBean {
  67. FileSystemResource resource;
  68. String filename;
  69. }

下面是MultipartFile转File的方法

  1. /**
  2. * multiFile转成file,在本地生成一个文件,文件名随机,使用完需删除
  3. *
  4. * @param multiFile 要转换的文件
  5. * @return
  6. */
  7. public static Optional<File> multipartFileToFile(MultipartFile multiFile) {
  8. // 获取文件名
  9. String fileName = multiFile.getOriginalFilename();
  10. // 获取文件后缀
  11. String prefix = getExtention(fileName);
  12. try {
  13. File file = File.createTempFile(UUIDUtils.getUUID(), prefix);
  14. file.deleteOnExit();
  15. multiFile.transferTo(file);
  16. return Optional.of(file);
  17. } catch (Exception e) {
  18. e.printStackTrace();
  19. }
  20. return Optional.empty();
  21. }

6.使用模板发送邮件

我们使用thymeleaf作为模板来发送邮件,首先引入依赖

  1. <!-- thymeleaf模板 -->
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-thymeleaf</artifactId>
  5. </dependency>

 加入配置项,所有模板放在类路径的templates下面并且以html结尾

  1. spring:
  2. thymeleaf:
  3. cache: false
  4. mode: LEGACYHTML5
  5. prefix: classpath:/templates/
  6. suffix: .html

然后在建一个mail.html

  1. <!DOCTYPE html>
  2. <html lang="en" xmlns:th="http://www.thymeleaf.org">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>邮件模板</title>
  6. </head>
  7. <body>
  8. <p>您好,感谢您的注册,这时一封验证邮件,请点击下面的链接完成注册!</p>
  9. <a href="#" th:href="@{http://www.baidu.com(id=${id})}">点我完成注册</a>
  10. </body>
  11. </html>

使用templateEngine拿到模板和参数,渲染成html, 之后就跟发送html邮件一样了

  1. @Async
  2. public void sendTemplateEmail(String[] tos, String subject, String templateName, Map<String, Object> params) {
  3. Context context = new Context();
  4. //设置参数
  5. if (params != null) {
  6. Set<Map.Entry<String, Object>> entrySet = params.entrySet();
  7. entrySet.stream().forEach(entry -> context.setVariable(entry.getKey(), entry.getValue()));
  8. }
  9. //渲染模板,获得html内容
  10. String html = templateEngine.process("email/" + templateName, context);
  11. sendHtmlEmail(tos, subject, html);
  12. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/95370?site
推荐阅读
相关标签
  

闽ICP备14008679号