1 介绍

参考连接:spring-boot-demo
springboot提供了mail的发送jar包,当然你可以选择其他jar包实现,比如阿里云提供的sdk来实现,腾讯云的sdk实现。
我们用阿里云的简单例子,来解释发送邮箱,需要的必须参数。

  1. public class email {
  2. public static void main(String[] args) throws EmailException {
  3. SimpleEmail email =new SimpleEmail();
  4. //邮箱发送的地址
  5. email.setHostName("smtp.qq.com");
  6. //发信人账号和密码或授权码(授权码会过期)
  7. email.setAuthentication("***3457107", "your code");
  8. //邮箱标题
  9. email.setFrom("***3457107@qq.com","你好!");
  10. // ssl协议
  11. email.setSSLOnConnect(true);
  12. //发送邮箱地址
  13. email.addTo("***7887868@qq.com");
  14. //邮箱正文标题
  15. email.setSubject("我是一封简单文本邮件标题!");
  16. //邮箱内容
  17. email.setMsg("hello world!");
  18. //发送
  19. email.send();
  20. }
  21. }

从上面看,必选参数有邮件的服务器地址、发信人账号和授权码、邮件标题、邮件收信人、邮件正文标题、邮件内容。
这就是基本参数,而一些抄送、密送、发送时间、附件等都是可选参数。
而授权码则需要我们手动配置一下,登录QQ邮箱,找到设置->账户->生成授权码,发送对应的短信后,就会出现授权码。
SpringBoot整合Mail简单文本邮件 - 图1

1 知识储备

在学习邮件发送之前,我们先来学习一下jasypt配置文件加解密
当我们的application.yml配置文件一些敏感数据,不希望直接暴露在文件中,而使用密钥加密后,得到一串密码。
就比如,授权码这类信息过于敏感,那么我们可以进行加密。
选择jasypt技术,和springboot整合后,就不需要程序员去管加密解密过程,只需要在配置文件中,将加密字符串放在对应位置,以HNC(加密字符串)格式,springboot会自动识别,无需在写其他代码。
注意:加密字符串需要在@test生成,一旦你改变了密码,那么需要重新生成,并且配置文件的加密字符串需要空处理,当然你可以使用jar包来生成密文。

1.1 jasypt技术

1.1.1 引入依赖

  1. <parent>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-parent</artifactId>
  4. <version>2.0.1.RELEASE</version>
  5. </parent>
  6. <dependencies>
  7. <!-- Spring Boot 邮件依赖 -->
  8. <dependency>
  9. <groupId>org.springframework.boot</groupId>
  10. <artifactId>spring-boot-starter-mail</artifactId>
  11. </dependency>
  12. <!--jasypt配置文件加解密-->
  13. <dependency>
  14. <groupId>com.github.ulisesbocchio</groupId>
  15. <artifactId>jasypt-spring-boot-starter</artifactId>
  16. <version>${jasypt.version}</version>
  17. </dependency>
  18. <dependency>
  19. <groupId>org.springframework.boot</groupId>
  20. <artifactId>spring-boot-starter-test</artifactId>
  21. <scope>test</scope>
  22. </dependency>
  23. <dependency>
  24. <groupId>org.springframework.boot</groupId>
  25. <artifactId>spring-boot-starter-web</artifactId>
  26. </dependency>
  27. </dependencies>

1.1.2 测试类

  1. @RunWith(SpringRunner.class)
  2. @SpringBootTest
  3. public class Encryptor {
  4. /**
  5. * 密码解码器自动注入
  6. */
  7. @Autowired
  8. StringEncryptor encryptor;
  9. //加密
  10. @Test
  11. public void getPass() {
  12. String name = encryptor.encrypt("javaJunitPassword");
  13. System.out.println("加密结果:" + name);//解密
  14. }
  15. @Test
  16. public void passDecrypt() {
  17. String username = encryptor.decrypt("7nVX7m3/rNiz+i+oMxGwa/fAOK8cBrsep0CmXZB8JuHtD9K5lNsjW0Jli3wn9X8U");
  18. System.out.println("解密结果:" + username);
  19. }
  20. }

然后将密文放到配置文件中。

1.1.3 application.yml

  1. # 敏感数据时,可用jasypt加密,格式:ENC(加密字符串),算法:
  2. username: HNC(your code)
  3. # 为 jasypt 配置解密秘钥
  4. jasypt:
  5. encryptor:
  6. password: hikktn
  7. # 自定义算法,默认算法:PBEWithMD5AndDES
  8. ivGeneratorClassname: org.jasypt.salt.RandomIVGenerator

3 正式开始

3.1 引入依赖

  1. <parent>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-parent</artifactId>
  4. <version>2.0.1.RELEASE</version>
  5. </parent>
  6. <properties>
  7. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  8. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  9. <java.version>1.8</java.version>
  10. <jasypt.version>2.1.1</jasypt.version>
  11. </properties>
  12. <dependencies>
  13. <!-- Spring Boot 邮件依赖 -->
  14. <dependency>
  15. <groupId>org.springframework.boot</groupId>
  16. <artifactId>spring-boot-starter-mail</artifactId>
  17. </dependency>
  18. <!--jasypt配置文件加解密-->
  19. <dependency>
  20. <groupId>com.github.ulisesbocchio</groupId>
  21. <artifactId>jasypt-spring-boot-starter</artifactId>
  22. <version>${jasypt.version}</version>
  23. </dependency>
  24. <dependency>
  25. <groupId>org.springframework.boot</groupId>
  26. <artifactId>spring-boot-starter-test</artifactId>
  27. <scope>test</scope>
  28. </dependency>
  29. <dependency>
  30. <groupId>org.springframework.boot</groupId>
  31. <artifactId>spring-boot-starter-web</artifactId>
  32. </dependency>
  33. <dependency>
  34. <groupId>cn.hutool</groupId>
  35. <artifactId>hutool-all</artifactId>
  36. <version>5.4.1</version>
  37. </dependency>
  38. <!-- Spring Boot 模板依赖 -->
  39. <dependency>
  40. <groupId>org.springframework.boot</groupId>
  41. <artifactId>spring-boot-starter-thymeleaf</artifactId>
  42. </dependency>
  43. </dependencies>
  44. <build>
  45. <finalName>spring-boot-demo-email</finalName>
  46. <plugins>
  47. <plugin>
  48. <groupId>org.springframework.boot</groupId>
  49. <artifactId>spring-boot-maven-plugin</artifactId>
  50. </plugin>
  51. </plugins>
  52. </build>

3.2 application.yml

  1. spring:
  2. mail:
  3. host: smtp.qq.com #SMTP服务器地址
  4. port: 465
  5. username: ***3457107 #登陆账号
  6. # 敏感数据时,可用jasypt加密,格式:ENC(加密字符串),算法:
  7. password: ENC(your encryptor code) #登陆密码(或授权码)
  8. #服务协议
  9. protocol: smtp
  10. # 连接失败,跳过错误
  11. test-connection: true
  12. # 编码集
  13. default-encoding: UTF-8
  14. properties:
  15. from: ***3457107@qq.com #邮件发信人(即真实邮箱)
  16. to: ***7887868@qq.com # 邮件接信人(为方便测试)
  17. # 设置是否需要认证
  18. mail.smtp.auth: true
  19. #
  20. mail.smtp.starttls.enable: true
  21. mail.smtp.starttls.required: true
  22. # ssl
  23. mail.smtp.ssl.enable: true
  24. servlet:
  25. multipart:
  26. max-file-size: 10MB #限制单个文件大小
  27. max-request-size: 50MB #限制请求总量
  28. # 为 jasypt 配置解密秘钥
  29. jasypt:
  30. encryptor:
  31. password: hikktn
  32. # 自定义算法,默认算法:PBEWithMD5AndDES
  33. ivGeneratorClassname: org.jasypt.salt.RandomIVGenerator

3.3 MailService.java

  1. public class MailService {
  2. /**
  3. * java邮件发送类
  4. */
  5. @Autowired
  6. private JavaMailSender mailSender;
  7. /**
  8. * 发件人邮箱
  9. */
  10. @Value("${spring.mail.properties.from}")
  11. private String from;
  12. /**
  13. * 收件人邮箱
  14. */
  15. @Value("${spring.mail.properties.to}")
  16. private String to;
  17. /**
  18. * 发送文本邮件
  19. *
  20. * @param subject 邮件主题
  21. * @param content 邮件内容
  22. * @param cc 抄送地址
  23. */
  24. public void sendSimpleMail(String subject, String content, String... cc) {
  25. // 创建文本邮箱消息类
  26. SimpleMailMessage message = new SimpleMailMessage();
  27. // 设置发件人邮箱
  28. message.setFrom(from);
  29. // 设置收件人邮箱
  30. message.setTo(to);
  31. // 设置邮箱标题
  32. message.setSubject(subject);
  33. // 设置邮箱主体内容
  34. message.setText(content);
  35. // 抄送人不为空的场合
  36. if (ArrayUtil.isNotEmpty(cc)) {
  37. // 设置抄送人
  38. message.setCc(cc);
  39. }
  40. // 发送消息
  41. mailSender.send(message);
  42. }
  43. }

3.4 测试类

  1. @RunWith(SpringRunner.class)
  2. @SpringBootTest
  3. public class MailServiceTest {
  4. @Autowired
  5. private MailService mailService;
  6. /**
  7. * 测试简单邮件
  8. */
  9. @Test
  10. public void sendSimpleMail() {
  11. mailService.sendSimpleMail("这是一封简单邮件", "这是一封普通的SpringBoot测试邮件");
  12. }
  13. }

3.5 结果

SpringBoot整合Mail简单文本邮件 - 图2