邮箱发送会被抽象成为一个接口,或者说是验证码发送接口。
该接口允许任意形式发送验证码,包括邮箱发送和手机发送。
对于邮箱发送而言
使用正则表达式验证
2.发送
验证码防止重复发送业务逻辑
验证码有两个时间,一个是自身验证的有效时间,一个是防止被重复发送验证码的间隔时间。前面推荐15min过期时间,后面推荐1min过期时间
防止邮箱重复发送验证码解决方案:
1.在前端进行重复验证码校验
优点:简单
缺点:容易被其它人绕过前端,直接访问接口
2.用redis单独记录验证码发送信息
优点:相对简单
缺点:发送验证码和记录验证码发送信息不是原子操作,存在事务问题。两条记录消耗redis内存空间。
可以用消息队列进行可靠性投递解决,也可以使用事务解决(但太重量级了)
3.在value中嵌入时间戳
较为简单,但对业务有一定的侵入。
账号准备和配置
<!--发送邮件-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
* 配置文件
```
#邮箱服务配置
mail:
host: smtp.126.com #发送邮件服务器
username: ******@126.com #发送邮件的邮箱地址
password: **自己授权码** #客户端授权码,不是邮箱密码,网易的是自己设置的
from: ******@126.com # 发送邮件的地址,和上面username一致
properties.mail.smtp.starttls.enable: true
properties.mail.smtp.starttls.required: true
properties.mail.smtp.ssl.enable: true
default-encoding: utf-8
```
@Service
@Slf4j
public class MailServiceImpl implements MailService {
/**
* Spring Boot 提供了一个发送邮件的简单抽象,直接注入即可使用
*/
@Autowired
private JavaMailSender mailSender;
/**
* 配置文件中的发送邮箱
*/
@Value("${spring.mail.from}")
private String from;
@Override
public void sendSimpleMail(String to, String subject, String content) {
//创建SimpleMailMessage对象
SimpleMailMessage message = new SimpleMailMessage();
//邮件发送人
message.setFrom(from);
//邮件接收人
message.setTo(to);
//邮件主题
message.setSubject(subject);
//邮件内容
message.setText(content);
//发送邮件
mailSender.send(message);
log.info("邮件发成功:{}",message.toString());
}
}
原文:https://www.cnblogs.com/zhoujianyi/p/15168818.html