springboot 版本:2.6.3
Java版本:1.8
一、应用场景
-
用户注册发送激活邮箱
-
注册登录时用邮箱接收验证码
-
用户密码重置
-
向用户发送相关系统消息
-
…
二、添加依赖
<!-- 邮箱 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
三、邮箱配置:以qq邮箱为例
-
在qq邮箱中开启
smtp
服务并获取授权码。在设置->账号
路径下。 -
在spingboot中配置邮件信息
spring: # 邮箱验证配置 mail: host: smtp.qq.com # smtp 服务主机 protocol: smtp # smtp 协议 default-encoding: UTF-8 username: xxx@qq.com # 邮箱 password: xxx # 授权码 nickname: xxx # 发邮件时显示的昵称 test-connection: false properties: mail: smtp: auth: true starttls: enable: true required: true
注:
test-connection
字段代表是否在项目启动时验证邮箱服务是否可用,如果设置成true
,则只有在邮箱服务可用时项目才能启动成功;而设置成false
时只有在使用邮箱服务时才会检测邮箱服务是否可用。四、邮箱API使用
-
SimpleMailMessage
类邮件类,用来设置邮件的各部分内容,常用方法:
// 设置发送人信息 public void setFrom(String from) { this.from = from; } // 设置收件人信息:邮箱 public void setTo(String to); // 设置邮件主题 public void setSubject(String subject) { this.subject = subject; } // 设置邮件内容 public void setText(String text) { this.text = text; }
-
JavaMailSender
接口发送邮件的类,可以看到它的
send
方法接收的都是MimeMessage
类型,而我们的是SimpleMailMessage
类型,其实是使用的MailSender
接口中的方法。public interface JavaMailSender extends MailSender { MimeMessage createMimeMessage(); MimeMessage createMimeMessage(InputStream contentStream) throws MailException; void send(MimeMessage mimeMessage) throws MailException; void send(MimeMessage... mimeMessages) throws MailException; void send(MimeMessagePreparator mimeMessagePreparator) throws MailException; void send(MimeMessagePreparator... mimeMessagePreparators) throws MailException; }
public interface MailSender { void send(SimpleMailMessage simpleMessage) throws MailException; void send(SimpleMailMessage... simpleMessages) throws MailException; }
五、验证邮箱服务
-
编写一个发送验证码的
controller
@RestController @Api(value = "v1", tags = "6.GeoFriend 邮件相关接口") @RequestMapping("/api/v1") public class EmailAPI { @Autowired private JavaMailSender mailSender; @Autowired private RedisGeoDao redisGeoDao; /** * 邮箱 */ @Value("${spring.mail.username}") private String sender; /** * 获取发件人昵称 */ @Value("${spring.mail.nickname}") private String nickname; /** * 发送验证码 * @param email 收件人 * @return */ @PostMapping("/email/code") public ResultBean sendCode(@RequestBody EmailParam email){ if(!NumberUtil.isEmail(email.getEmail())){ return ResultBeanGenerator.error(ServiceResultEnum.LOGIN_NAME_IS_NOT_EMAIL.getResult()); } SimpleMailMessage message = new SimpleMailMessage(); message.setFrom(nickname + '<' + sender + '>'); message.setTo(email.getEmail()); message.setSubject("请查收验证码~"); String code = RandomUtil.randomNumbers(6); String content = "【验证码】您的验证码为:" + code + " 。 验证码五分钟内有效,逾期作废。\n\n\n" + "------------------------------\n\n\n" + "更多信息可访问:\n\n" + "https://blog.csdn.net/qq_44957574?type=blog\n\n"; message.setText(content); mailSender.send(message); redisGeoDao.addCode(email.getEmail(), code); return ResultBeanGenerator.success("验证码发送成功!"); } }
-
使用postman发送请求
-
查看邮箱是否发送
-
-