『博客开发日记-后台』之获取邮箱验证码接口的实现

本文最后更新于 2026年5月22日 下午

获取邮箱验证码接口的实现


获取邮箱验证码接口的需求

这是后台用户需要换绑邮箱时进行发送验证码操作的

校验邮箱不能为空

校验邮箱格式

记录IP地址,防止大量请求发送验证码

获得验证码并存入redis


代码实现

在 AdminUserController 中

1
2
3
4
5
6
7
8
@PostMapping("/email/code")
@SystemLog(businessName = "获取邮箱验证码接口")
@ApiOperation(value = "获取邮箱验证码接口", notes = "用户更换或绑定邮箱时获取邮箱验证码", response = String.class)
@ApiImplicitParam(name = "email", value = "邮箱地址", dataType = "String", paramType = "query", required = true)
public ResponseResult getEmailCode(@RequestParam String email)
{
return adminUserService.getEmailCode(email);
}

在 ContentTypeValidationFilter 中给接口放行


在 EmailServiceImpl 中添加方法

由于发送邮箱验证码之前写过集成的邮件

所以直接写方法传参就行了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
//发送修改/绑定邮箱验证码邮件
@Async("asyncExecutor")
public void sendVerificationCodeByUpdateOrBind(String to, String code)
{
sendVerificationEmail(to, code, "邮箱绑定/更换", "您正在进行邮箱绑定或更换操作,请使用以下验证码完成验证。");
}

//根据场景获取主题颜色
private String getThemeColor(String scene)
{
return switch (scene) {
case "登录" -> "#30a9de"; // 蓝色
case "注册" -> "#52c41a"; // 绿色
case "重置密码" -> "#ff6b6b"; // 红色
case "邮箱绑定/更换" -> "#de6530"; //橙色
default -> "#30a9de";
};
}

//根据场景获取问候语
private String getGreeting(String scene)
{
return switch (scene) {
case "注册" -> "⌯ᵔᗜᵔ⌯ಣ 欢迎加入!";
case "重置密码" -> "密码重置";
case "邮箱绑定/更换" -> "邮箱绑定/更换";
default -> " (๓´˘`๓) 您好!";
};
}

添加枚举

1
EMAIL_FORMAT_ERROR(1025, "邮箱格式错误"),

在 AdminUserServiceImpl 中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
//发送邮箱验证码
@Override
public ResponseResult getEmailCode(String email)
{
//校验邮箱不能为空
if (!StringUtils.hasText(email)) {
return ResponseResult.errorResult(AppHttpCodeEnum.SYSTEM_ERROR, "手机号不能为空");
}

email = email.trim();

//校验邮箱格式
if (!email.matches("^[A-Za-z0-9+_.-]+@[A-Za-z0-9.-]+$")) {
return ResponseResult.errorResult(AppHttpCodeEnum.EMAIL_FORMAT_ERROR);
}

//记录IP地址
String clientIp = getClientIp();
ResponseResult limitResult = checkCodeLimit(email, clientIp);
if (limitResult != null) {
return limitResult;
}

//获得验证码并存入redis
String code = generateCode();
String redisKey = saveCodeToRedis(email, code, clientIp);

try {
emailServiceImpl.sendVerificationCodeByUpdateOrBind(email, code);
} catch (Exception e) {
redisCache.deleteObject(redisKey);
redisCache.deleteObject(String.format("admin:send:time:%s", email));
log.error("发送邮箱验证码失败, email={}, error={}", email, e.getMessage(), e);
return ResponseResult.errorResult(AppHttpCodeEnum.SYSTEM_ERROR, "验证码发送失败,请稍后重试");
}

return ResponseResult.okResult();
}




PS:该系列只做为作者学习开发项目做的笔记用

不一定符合读者来学习,仅供参考


预告

后续会记录博客的开发过程

每次学习会做一份笔记来进行发表

“一花一世界,一叶一菩提”


版权所有 © 2026 云梦泽
欢迎访问我的个人网站:https://hgt12.github.io/


『博客开发日记-后台』之获取邮箱验证码接口的实现
http://example.com/2026/05/22/『博客开发日记-后台』之获取邮箱验证码接口的实现/
作者
云梦泽
发布于
2026年5月22日
更新于
2026年5月22日
许可协议