Java实现邮箱验证码

傷城~ 2023-10-13 10:32 109阅读 0赞

目录:

前言

一、POM依赖

二、获取验证码

三、配置文件

四、业务代码

1.service接口

2.service实现类

3.相关工具类Util

4.查询Redis数据库

5.接收邮件


前言

邮箱验证码是一个常见的功能,常用于邮箱绑定、修改密码等操作上,本篇博客只要讲的是如何使用springboot实现验证码的发送功能。我使用redis数据库保存临时的邮箱验证码信息。

e260b3cd1bb94550a0da7c9cbf9f04c2.jpeg


一、POM依赖

  1. <dependencies>
  2. <!--mail邮件发送-->
  3. <dependency>
  4. <groupId>org.springframework.boot</groupId>
  5. <artifactId>spring-boot-starter-mail</artifactId>
  6. </dependency>
  7. <!--redis场景启动器-->
  8. <dependency>
  9. <groupId>org.springframework.boot</groupId>
  10. <artifactId>spring-boot-starter-data-redis</artifactId>
  11. </dependency>
  12. <!-- redis 连接池 -->
  13. <!--新版本连接池lettuce-->
  14. <dependency>
  15. <groupId>org.apache.commons</groupId>
  16. <artifactId>commons-pool2</artifactId>
  17. </dependency>
  18. </dependencies>

二、获取验证码

步骤:1.登录QQ邮箱—>2.设置—>3.账户安全—>4.开启服务(POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务)

d26d01c72044406680a736d7fa6660b0.jpeg

按要求发送短信,即可获取授权码(获取的授权码记得保存,之后会用到哦)

4cbc2a516d38422387a7c398174e8ca0.jpeg

三、配置文件

  • username:是你的邮箱,不是用户名
  • password:是授权码,不是密码
  • host:是SMTP服务器,不是IP地址

    spring:

    mail邮箱

    mail:

    1. # SMTP服务器(我用的是QQ邮箱的SMTP服务器地址,如果用的其它邮箱请另行百度搜索)
    2. host: smtp.qq.com
    3. # 发送验证码的邮箱(发件人的邮箱)
    4. username: ***@qq.com
    5. # 授权码
    6. password: ***
    7. # 编码
    8. default-encoding: utf-8
    9. # 其它参数
    10. properties:
    11. mail:
    12. smtp:
    13. # 如果是用SSL方式,需要配置如下属性,使用qq邮箱的话需要开启
    14. ssl:
    15. enable: true
    16. required: true
    17. # 邮件接收时间的限制,单位毫秒
    18. timeout: 10000
    19. # 连接时间的限制,单位毫秒
    20. connection-timeout: 10000
    21. # 邮件发送时间的限制,单位毫秒
    22. write-timeout: 10000

PS:我这里用的是QQ邮箱做的演示,如果用的其它邮箱请另行百度搜索,替换SMTP地址。

四、业务代码

1.service接口
  1. // 发送邮件
  2. String sendEmail(String email);
2.service实现类

PS:需要先判断这个邮箱是否在redis中已经存在key,防止重复发送。

  1. import com.test.java.util.VerifyCodeUtil;
  2. import lombok.extern.slf4j.Slf4j;
  3. import org.apache.commons.lang3.StringUtils;
  4. import org.springframework.data.redis.core.StringRedisTemplate;
  5. import org.springframework.data.redis.core.ValueOperations;
  6. import org.springframework.mail.SimpleMailMessage;
  7. import org.springframework.mail.javamail.JavaMailSender;
  8. import org.springframework.stereotype.Service;
  9. import javax.annotation.Resource;
  10. import javax.mail.internet.InternetAddress;
  11. import javax.mail.internet.MimeUtility;
  12. import java.util.concurrent.TimeUnit;
  13. /**
  14. * 用户业务实现类
  15. */
  16. @Service
  17. @Slf4j
  18. public class UserServiceImpl implements UserService {
  19. @Resource
  20. private StringRedisTemplate stringRedisTemplate;
  21. @Resource
  22. private JavaMailSender javaMailSender;
  23. @Resource
  24. private VerifyCodeUtil verifyCodeUtil;
  25. @Override
  26. public String sendEmail(String email) {
  27. if (StringUtils.isBlank(email)) {
  28. throw new RuntimeException("未填写收件人邮箱");
  29. }
  30. // 定义Redis的key
  31. String key = "msg_" + email;
  32. ValueOperations<String, String> valueOperations = stringRedisTemplate.opsForValue();
  33. String verifyCode = valueOperations.get(key);
  34. if (verifyCode == null) {
  35. // 随机生成一个6位数字型的字符串
  36. String code = verifyCodeUtil.generateVerifyCode(6);
  37. // 邮件对象(邮件模板,根据自身业务修改)
  38. SimpleMailMessage message = new SimpleMailMessage();
  39. message.setSubject("**游戏注册邮箱验证码");
  40. message.setText("尊敬的用户您好!\n\n感谢您注册**游戏。\n\n尊敬的: " + email + "您的校验验证码为: " + code + ",有效期5分钟,请不要把验证码信息泄露给其他人,如非本人请勿操作");
  41. message.setTo(email);
  42. try {
  43. // 对方看到的发送人(发件人的邮箱,根据实际业务进行修改,一般填写的是企业邮箱)
  44. message.setFrom(new InternetAddress(MimeUtility.encodeText("**游戏官方") + "<1*********@qq.com>").toString());
  45. // 发送邮件
  46. javaMailSender.send(message);
  47. // 将生成的验证码存入Redis数据库中,并设置过期时间
  48. valueOperations.set(key, code, 5L, TimeUnit.MINUTES);
  49. log.info("邮件发送成功");
  50. return "邮件发送成功";
  51. } catch (Exception e) {
  52. log.error("邮件发送出现异常");
  53. log.error("异常信息为" + e.getMessage());
  54. log.error("异常堆栈信息为-->");
  55. return "邮件发送失败";
  56. //e.printStackTrace();
  57. //throw new RuntimeException(e);
  58. }
  59. } else {
  60. return "验证码已发送至您的邮箱,请注意查收";
  61. }
  62. }
3.相关工具类Util
  1. import org.springframework.data.redis.core.StringRedisTemplate;
  2. import org.springframework.data.redis.core.ValueOperations;
  3. import org.springframework.stereotype.Component;
  4. import javax.annotation.Resource;
  5. import java.util.Random;
  6. /**
  7. * 验证码相关工具类
  8. */
  9. @Component
  10. public class VerifyCodeUtil {
  11. @Resource
  12. private StringRedisTemplate stringRedisTemplate;
  13. /**
  14. * 随机生成指定长度字符串验证码
  15. *
  16. * @param length 验证码长度
  17. */
  18. public String generateVerifyCode(int length) {
  19. String strRange = "1234567890";
  20. StringBuilder strBuilder = new StringBuilder();
  21. for (int i = 0; i < length; ++i) {
  22. char ch = strRange.charAt((new Random()).nextInt(strRange.length()));
  23. strBuilder.append(ch);
  24. }
  25. return strBuilder.toString();
  26. }
  27. /**
  28. * 校验验证码(可用作帐号登录、注册、修改信息等业务)
  29. * 思路:先检查redis中是否有key位对应email的键值对,没有代表验证码过期;如果有就判断用户输入的验证码与value是否相同,进而判断验证码是否正确。
  30. */
  31. public Integer checkVerifyCode(String email, String code) {
  32. int result = 1;
  33. ValueOperations<String, String> valueOperations = stringRedisTemplate.opsForValue();
  34. String msgKey = "msg_" + email;
  35. String verifyCode = valueOperations.get(msgKey);
  36. /*校验验证码:0验证码错误、1验证码正确、2验证码过期*/
  37. if (verifyCode == null) {
  38. result = 2;
  39. } else if (!code.equals(verifyCode)) {
  40. result = 0;
  41. }
  42. // 如果验证码正确,则从redis删除
  43. if (result == 1) {
  44. stringRedisTemplate.delete(msgKey);
  45. }
  46. return result;
  47. }
  48. }
4.查询Redis数据库

6b8936c09f4c47f5afb1b548afc00e23.jpeg

" class="reference-link">5.接收邮件 437f61aa6fa34640989472190396c92c.jpeg

如果这篇文章对您有所帮助,或者有所启发的话,求一键三连:点赞、评论、收藏➕关注,您的支持是我坚持写作最大的动力。

#

发表评论

表情:
评论列表 (有 0 条评论,109人围观)

还没有评论,来说两句吧...

相关阅读

    相关 php实现邮箱验证

    一、Introduction 需求是用户在注册时填写email,注册后,需要到邮箱验证后才能登陆。 二、实现 验证流程,注册成功后,为用户生成一个验证码;将验证码以连接方

    相关 邮箱验证功能实现

    在进行实际项目的开发过程中,我们可能会遇到需要需要对用户账号密码进行找回,这时就需要我们通过邮件进行验证,从而对用户信息进行修改,下面我就将自己开发过程中的邮件发送功能简单描述