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

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.dtcms.com/a/346958.html

相关文章:

  • 数据库MVCC是什么
  • 每日算法题【链表】:链表的中间节点、返回倒数第k个节点、合并两个有序链表
  • Git checkout 与 Git reset 核心区别解析(分支与版本关联逻辑)
  • C语言初学者笔记【动态内存管理】
  • 在WSL2 Ubuntu中部署FastDFS服务的完整指南
  • Elasticsearch底层存储原理
  • Codeforces Round 1043 (Div. 3)(A-E)
  • 数据库优化提速(三)JSON数据类型在酒店管理系统搜索—仙盟创梦IDE
  • jetson ubuntu 打不开 firefox和chromium浏览器
  • 非线性规划学习笔记
  • SpringBootWeb入门
  • 力扣(全排列)
  • 生成模型 | 扩散模型损失函数公式推导
  • Go语言数据结构与算法-基础数据结构
  • 《WinRAR》 [7.12] [x64] 烈火版 下载
  • 数据结构的线性表:顺序表
  • piecewise jerk算法介绍
  • 2025年音乐创作大模型有哪些?国内国外模型汇总以及优点分析
  • 高阶数据结构---ST表
  • 同类软件对比(一):Visual Studio(IDE) VS Visual Studio Code
  • [CISCN2019 华北赛区 Day1 Web5]CyberPunk
  • MySQL存储过程入门
  • OCR、文档解析工具合集(下)
  • MySQL InnoDB引擎
  • STM32F1 SysTick介绍及应用
  • Nacos-12--扩展:@RefreshScope和@ConfigurationProperties实现热更新的原理
  • PHP - 线程安全 - 疑问与答案
  • springboot 表现层消息一致性处理:前后端数据协议
  • SpringMVC相关自动配置
  • 第1篇:走进日志框架的世界 - 从HelloWorld到企业级应用