轻松实现邮箱验证码功能!快来体验Spring Boot的神奇力量!

左手的ㄟ右手 2024-03-17 14:23 119阅读 0赞

邮件验证是现代互联网服务中常用的安全功能,本文介绍如何利用Spring Boot框架快速搭建一个高效易用的邮箱验证码功能。从配置邮箱>发送服务,到编写验证逻辑,无痛实现邮箱验证码功能轻而易举。快来掌握这个技能,加强您的应用安全性吧!
Spring Boot是一个用于构建Java应用程序的开源框架,它简化了Java开发流程并提供了各种功能,使开发人员能够更快地构建高效的应>用。在本文中,我们将讨论如何使用Spring Boot实现邮箱验证码功能。
邮件验证码是一种常见的身份验证方法,它通过向用户发送包含验证码的电子邮件来验证其身份。在实现这个功能之前,我们需要一些先决条件:

  1. 一个可用的SMTP服务器:我们将使用一个SMTP服务器来发送电子邮件。您可以选择自己的SMTP服务器或使用一个免费的SMTP服务器,如Gmail、网易邮箱、QQ邮箱、新浪邮箱等。
  2. Spring Boot项目:我们将使用Spring Boot来构建我们的应用程序。您可以使用Spring Initializr生成一个新的Spring Boot项目。

这里测试了国内三家邮箱,网易邮箱、QQ邮箱、新浪邮箱的发送邮件的速度,博主所在的地区时河南洛阳,使用的网路是联通宽带,经过测试,发现网易邮箱响应最快!现在让我们开始实现邮箱验证码功能。

技术实现

Spring Boot 发送邮件验证码的功能,主要用到了spring-boot-starter-mail工具包实现邮件的发送功能,利用junit-vintage-engine工具包实现了html邮件模板功能,利用easy-captcha工具包生成随机验证码 的功能!

引入依赖

首先在springboot项目中引入邮箱依赖
maven方式:

  1. <!--引入mail依赖-->
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-mail</artifactId>
  5. </dependency>
  6. <!--mail模板-->
  7. <dependency>
  8. <groupId>org.junit.vintage</groupId>
  9. <artifactId>junit-vintage-engine</artifactId>
  10. <scope>test</scope>
  11. <exclusions>
  12. <exclusion>
  13. <groupId>org.hamcrest</groupId>
  14. <artifactId>hamcrest-core</artifactId>
  15. </exclusion>
  16. </exclusions>
  17. </dependency>
  18. <!--验证码-->
  19. <dependency>
  20. <groupId>com.github.whvcse</groupId>
  21. <artifactId>easy-captcha</artifactId>
  22. <version>1.6.2</version>
  23. </dependency>

相关配置

然后再spring的配置文件中,设置mail相关配置:

  1. spring:
  2. mail:
  3. host: smtp.163.com
  4. username: 你的邮箱
  5. password: 邮箱授权码
  6. default-encoding: UTF-8
  7. protocol: smtp
  8. properties:
  9. mail:
  10. smtp:
  11. auth: true # 启用SMTP认证
  12. starttls:
  13. enabled: true # 启用SMTP认证
  14. required: true # 必须采用加密链接

开启SMTP服务

前往你的邮箱网站,以网易邮箱为例,打开网易邮箱地址,登录你的邮箱,进入邮箱管理后台界面。
在这里插入图片描述
点击“设置”》》“POP3/SMTP/IMAP”后,点击开启SMTP服务即可。
在这里插入图片描述
开启时一般需要手机扫码,或者发送短信进行验证。开启后,会生成一个授权码,复制好粘贴到上面spring application.yml 文件相关的配置中。
在这里插入图片描述

代码实现

创建一个MailService类,实现邮件发送的功能,代码如下:

  1. import com.tarzan.nav.modules.admin.service.sys.SysConfigService;
  2. import com.tarzan.nav.utils.DateUtil;
  3. import lombok.extern.slf4j.Slf4j;
  4. import org.antlr.stringtemplate.StringTemplate;
  5. import org.antlr.stringtemplate.StringTemplateGroup;
  6. import org.springframework.beans.factory.annotation.Value;
  7. import org.springframework.mail.javamail.JavaMailSender;
  8. import org.springframework.mail.javamail.MimeMessageHelper;
  9. import org.springframework.scheduling.annotation.Async;
  10. import org.springframework.stereotype.Component;
  11. import javax.annotation.Resource;
  12. import javax.mail.MessagingException;
  13. import javax.mail.internet.InternetAddress;
  14. import javax.mail.internet.MimeMessage;
  15. import javax.mail.internet.MimeUtility;
  16. import java.io.UnsupportedEncodingException;
  17. import java.util.Objects;
  18. /**
  19. * @author tarzan
  20. */
  21. @Component("mailService")
  22. @Slf4j
  23. public class MailService {
  24. private static final StringTemplateGroup templateGroup;
  25. @Resource
  26. private SysConfigService sysConfigService;
  27. static{
  28. String classpath = Objects.requireNonNull(MailService.class.getClassLoader().getResource("")).getPath();
  29. templateGroup = new StringTemplateGroup("mailTemplates", classpath + "/mailTemplates");
  30. }
  31. public static String IMG_BASE_URL;
  32. public static String ACTIVATE_CONTEXT="http:";
  33. public static String RESET_PWD_CONTEXT;
  34. @Value("${spring.mail.username}")
  35. private String username;
  36. @Resource
  37. private JavaMailSender mailSender;
  38. private void sendMail(String to, String subject, String body) {
  39. MimeMessage mail = mailSender.createMimeMessage();
  40. try {
  41. MimeMessageHelper helper = new MimeMessageHelper(mail, true, "utf-8");
  42. helper.setFrom(new InternetAddress(MimeUtility.encodeText(sysConfigService.getSiteName())+"<"+username+">").toString());
  43. helper.setTo(to);
  44. helper.setSubject(subject);
  45. helper.setText(body, true);
  46. helper.setSentDate(DateUtil.now());
  47. mailSender.send(mail);
  48. } catch (MessagingException|UnsupportedEncodingException e) {
  49. log.error(e.getMessage());
  50. }
  51. }
  52. /**
  53. * send activation mail to
  54. * @param to,key
  55. */
  56. public void sendAccountActivationEmail(String to, String key){
  57. StringTemplate activation_temp = templateGroup.getInstanceOf("activation");
  58. activation_temp.setAttribute("img_base_url", IMG_BASE_URL);
  59. activation_temp.setAttribute("email", to);
  60. activation_temp.setAttribute("href", ACTIVATE_CONTEXT+key+"?email="+to);
  61. activation_temp.setAttribute("link", ACTIVATE_CONTEXT+key+"?email="+to);
  62. sendMail(to, sysConfigService.getSiteName()+"账户激活", activation_temp.toString());
  63. }
  64. @Async
  65. public void sendEmailCode(String to, String code){
  66. StringTemplate activation_temp = templateGroup.getInstanceOf("verificationCode");
  67. activation_temp.setAttribute("img_base_url", IMG_BASE_URL);
  68. activation_temp.setAttribute("email", to);
  69. activation_temp.setAttribute("code", code);
  70. sendMail(to, sysConfigService.getSiteName()+"邮箱验证码", activation_temp.toString());
  71. }
  72. /**
  73. * send change password link to
  74. * @param to,key
  75. */
  76. public void sendResetPwdEmail(String to, String key){
  77. StringTemplate activation_temp = templateGroup.getInstanceOf("resetpwd");
  78. activation_temp.setAttribute("img_base_url", IMG_BASE_URL);
  79. activation_temp.setAttribute("href", RESET_PWD_CONTEXT+"?key="+key+"&email="+to);
  80. activation_temp.setAttribute("link", RESET_PWD_CONTEXT+"?key="+key+"&email="+to);
  81. sendMail(to, sysConfigService.getSiteName()+"账户密码重置", activation_temp.toString());
  82. }
  83. }

代码中的SysConfigService主要是从数据库中,获取网站的名称的,这里不做展示,自行修改。
网站发送验证码,StringTemplateGroup模板文件verificationCode.st如下:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>泰山导航网站邮箱验证码</title>
  6. <style type="text/css">
  7. body{
  8. font-family: '微软雅黑','Helvetica Neue',sans-serif;
  9. }
  10. .container{
  11. max-width: 600px;
  12. margin: 0 auto;
  13. }
  14. .segment{
  15. background: #fff;
  16. border: 1px solid #e9e9e9;
  17. border-radius: 3px;
  18. padding: 20px;
  19. }
  20. .header{
  21. margin: 10px 0 30px 0;
  22. font-weight: 400;
  23. font-size: 20px;
  24. }
  25. .logo{
  26. margin: 0 auto;
  27. text-align: center;
  28. margin-bottom: 28px;
  29. }
  30. .logo img{
  31. width: 28px;
  32. height: auto;
  33. }
  34. </style>
  35. </head>
  36. <body>
  37. <div class="container">
  38. <div class="segment">
  39. <div class="logo">
  40. <img src="$img_base_url$logo_for_mail.png">
  41. </div>
  42. <div class="content">
  43. <div class="header">
  44. $email$
  45. </div>
  46. <p>欢迎加入泰山导航网站</p>
  47. <div>
  48. <p>您的验证码是:</p>
  49. <b>$code$</b>
  50. </div>
  51. <p>
  52. 如果验证码失效,请重新点击发送验证码
  53. </p>
  54. </div>
  55. </div>
  56. </div>
  57. </body>
  58. </html>

接口实现

spring boot Controller层,发送邮箱验证码的接口,代码如下:

  1. @PostMapping("/send/code")
  2. @ResponseBody
  3. public ResponseVo authCode(HttpServletRequest request,RegisterDTO dto) {
  4. SpecCaptcha captcha = new SpecCaptcha(10, 10, 4);
  5. captcha.setCharType(Captcha.TYPE_ONLY_NUMBER);
  6. request.getSession().setAttribute("captcha", captcha.text().toLowerCase());
  7. Matcher matcher = EMAIL_PATTERN.matcher(dto.getEmail_phone());
  8. if(matcher.matches()){
  9. mailService.sendEmailCode(dto.getEmail_phone(),captcha.text());
  10. return ResultUtil.status(1,"邮件已经发送");
  11. }else{
  12. return ResultUtil.status(4,"邮箱格式错误");
  13. }
  14. }

前端界面

在这里插入图片描述
在这里插入图片描述

结语

在本文中,我们讨论了如何使用Spring Boot实现邮箱验证码功能。我们首先添加了必要的依赖项,然后配置了SMTP服务器的详细信息。接下来,我们创建了一个验证码服务,该服务生成和发送包含验证码的电子邮件。最后,我们创建了一个REST控制器来演示验证码功能。
使用Spring Boot可以使开发人员更快地构建功能强大的应用程序,并且可以通过使用Spring的各种功能和库来简化开发过程。希望本文对您理解如何使用Spring Boot实现邮箱验证码功能有所帮助。
以上就是 springboot 实现邮箱发送验证码的全部教程,如果文章中,有错误或者有疑问的地方,请在评论区留言。创作不易,您的点赞和关注,是对我的持续创作的鼓舞!!!

发表评论

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

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

相关阅读

    相关 邮箱验证功能实现

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