当前位置: 首页 > ds >正文

Spring Boot 整合网易163邮箱发送邮件实现找回密码功能

在开发用户系统时,发送邮件是一项常见需求,例如用户忘记密码时,通过邮箱发送验证码来验证身份并重置密码。本文将结合 Spring Boot 和 163 邮箱,演示如何实现邮件发送功能。


一、前提条件

普通用户的 163 邮箱可以在 Spring Boot 项目中用于发送邮件,但需要完成以下配置:

1. 登录 163 邮箱

使用普通账号登录 163 邮箱官网。

2. 开启 SMTP 服务

  1. 点击邮箱右上角「设置」→「POP3/SMTP/IMAP」;
  2. 在 SMTP 服务选项中勾选「开启 SMTP 服务」;
  3. 按提示完成手机验证(163 邮箱要求绑定手机号才能开启该服务)。

在这里插入图片描述

在这里插入图片描述

3. 获取授权码

  1. 开启 SMTP 后,页面会提示生成授权码;
  2. 按照提示生成 16 位授权码(例如 abcdefghijklmnop),保存好;
  3. 该授权码将在 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.ymlapplication.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 分钟
  • 发送邮件后验证码会被存入 Redis,用户提交时进行比对。

http://www.xdnf.cn/news/18718.html

相关文章:

  • PHP - 线程安全 - 疑问与答案
  • PyQt6 进阶篇:构建现代化、功能强大的桌面应用
  • uniApp对接实人认证
  • Clustering Enabled Wireless Channel Modeling Using Big Data Algorithms
  • 【前端debug调试】
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘arviz’问题
  • 网站速度慢?安全防护弱?EdgeOne免费套餐一次性解决两大痛点
  • chapter05_从spring.xml读取Bean
  • 完整实验命令解析:从集群搭建到负载均衡配置
  • Java:类及方法常见规约
  • Unity中删除不及时的问题
  • 牛客面经2 京东社招-002
  • PyTorch框架之图像识别模型与训练策略
  • 25.深入对象
  • 寻找AI——高保真还原设计图生成App页面
  • 华为/思科/H3C/锐捷操作系统操作指南
  • 鸿蒙应用网络开发实战:HTTP、WebSocket、文件下载与网络检测全攻略
  • 微信小程序和uni-app面试问题总结
  • 网络模型深度解析:CNI、Pod通信与NetworkPolicy
  • Spring Boot 实时广播消息
  • Java集合(Collection、Map、转换)
  • git实战(7)git常用命令速查表
  • GitHub发布革命性工具:GitHub Spark,用自然语言打造全栈智能应用
  • 商品与股指类ETF期权买卖五档Tick分钟级历史行情数据分析
  • Node.js 和 Express 面试问题总结
  • 目标跟踪 YOLO11 单目标跟踪
  • Maven仓库与Maven私服架构
  • Spring Boot 实现 POJO 级联封装复杂属性
  • React Hooks UseRef的用法
  • 高速CANFD收发器ASM1042在割草机器人轮毂电机通信系统中的适配性研究