Spring Boot 整合网易163邮箱发送邮件实现找回密码功能
在开发用户系统时,发送邮件是一项常见需求,例如用户忘记密码时,通过邮箱发送验证码来验证身份并重置密码。本文将结合 Spring Boot 和 163 邮箱,演示如何实现邮件发送功能。
一、前提条件
普通用户的 163 邮箱可以在 Spring Boot 项目中用于发送邮件,但需要完成以下配置:
1. 登录 163 邮箱
使用普通账号登录 163 邮箱官网。
2. 开启 SMTP 服务
- 点击邮箱右上角「设置」→「POP3/SMTP/IMAP」;
- 在 SMTP 服务选项中勾选「开启 SMTP 服务」;
- 按提示完成手机验证(163 邮箱要求绑定手机号才能开启该服务)。
3. 获取授权码
- 开启 SMTP 后,页面会提示生成授权码;
- 按照提示生成 16 位授权码(例如
abcdefghijklmnop
),保存好; - 该授权码将在 Spring Boot 邮件配置中替代邮箱密码。
⚠️ 注意:普通 163 邮箱每天发送量有限,适合开发和测试用途。
二、Spring Boot 邮件依赖
在 pom.xml
中添加 Spring Boot 邮件依赖:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId>
</dependency>
三、Spring Boot 邮件配置
在 application.yml
或 application.properties
中添加 163 邮箱 SMTP 配置:
spring:
# 配置邮箱服务器,账号密码等mail:host: smtp.163.comusername: 1888888888@163.compassword: agagtfgsdhdcode:overtime: 5
其中
password
是生成的授权码,而非邮箱密码。
四、邮件发送服务实现
创建 MailService
接口:
public interface MailService {Result<String> getCode(String username, String mailAddress);
}
创建 MailServiceImpl
实现类:
@Service
public class MailServiceImpl implements MailService {@Autowiredprivate JavaMailSender mailSender;@Autowiredprivate StringRedisTemplate redisTemplate;@Autowiredprivate UserMapper userMapper;@Value("${spring.mail.username}")private String mailUserName;@Value("${spring.mail.code.overtime}")private Integer overtime; // 验证码过期时间(分钟)@Overridepublic Result<String> getCode(String username, String mailAddress) {// 校验用户名和邮箱if (StringUtils.isBlank(username)) return Result.fail("账号不能为空!");if (StringUtils.isBlank(mailAddress)) return Result.fail("邮箱不能为空!");User user = userMapper.selectUserByUsername(username);if (user == null) return Result.fail("账号不存在!");if (!user.getEmail().equals(mailAddress)) return Result.fail("输入邮箱和预留邮箱不一致!");// 生成验证码String verifyCode = redisTemplate.opsForValue().get("MAIL_CODE_" + username);if (verifyCode == null) {verifyCode = String.valueOf(new Random().nextInt(899999) + 100000);}redisTemplate.opsForValue().set("MAIL_CODE_" + username, verifyCode, overtime, TimeUnit.MINUTES);// 构建邮件内容String content = "<html><body>"+ "您好<br/>"+ "您的验证码是:" + verifyCode + "<br/>"+ "在" + overtime + "分钟内有效,请尽快使用。<br/>"+ "若非本人操作,请忽略此邮件。"+ "</body></html>";try {MimeMessage message = mailSender.createMimeMessage();MimeMessageHelper helper = new MimeMessageHelper(message, true);helper.setFrom(mailUserName);helper.setTo(mailAddress);helper.setSubject("找回密码验证码");helper.setText(content, true);mailSender.send(message);} catch (MessagingException e) {e.printStackTrace();return Result.fail("邮件发送失败!");}return Result.ok("验证码已发送至邮箱:" + mailAddress);}
}
五、邮件控制器
@RestController
@RequestMapping("/mail")
public class MailController {@Autowiredprivate MailService mailService;@GetMapping("/getCode")@ApiOperation("获取重置密码验证码")public Result<String> getCode(String username, String mailAddress){return mailService.getCode(username, mailAddress);}
}
六、Redis 验证码存储
-
使用
StringRedisTemplate
存储验证码:- Key:
MAIL_CODE_用户名
- Value: 验证码
- TTL:
spring.mail.code.overtime
分钟
- Key:
-
发送邮件后验证码会被存入 Redis,用户提交时进行比对。