邮箱验证码发送及验证

邮箱验证码发送及验证

代码简化,有需求可以联系

成果展示图

//获取验证码
在这里插入图片描述
//接收图
在这里插入图片描述

配置

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId>
</dependency>
spring.mail.host=smtp.qq.com
spring.mail.username=999999999@qq.com//发送者邮箱
spring.mail.password=xkzoexejzkylbgah//发送者邮箱授权值
spring.mail.default-encoding=utf-8

spring.mail.password的取值方法
根据如图片操作–
在这里插入图片描述
项目2
项目3

服务层

接口

public interface EmailService {/*** toEmail 接收验证码的邮箱* text 主题* message 主体信息* */public boolean sendEmail(String toEmail, String text, String message);
}

实现类

@Service
public class EmailServiceImpl implements EmailService{@Resourceprivate JavaMailSender javaMailSender;@Value("${spring.mail.username}")private String fromEmail;@Overridepublic boolean sendEmail(String toEmail, String text, String message) {SimpleMailMessage simpleMailMessage = new SimpleMailMessage();//设置发件邮箱simpleMailMessage.setFrom(fromEmail);//收件人邮箱simpleMailMessage.setTo(toEmail);//主题标题simpleMailMessage.setSubject(text);//信息内容simpleMailMessage.setText(message);//执行发送try {//发送可能失败javaMailSender.send(simpleMailMessage);//没有异常返回true,表示发送成功return true;} catch (Exception e) {//发送失败,返回falsereturn false;}}
}

控制层

//发送到邮箱验证码 --获取验证码

	@Resourceprivate EmailService emailService;@ResponseBody@RequestMapping("getEmailCode")//通过httpsession来存入验证码值public String getEmail(String toEmail,HttpSession httpSession){Random random = new Random();//生成随机验证码int code=1000+random.nextInt(8999);//把验证码存储到session中httpSession.setAttribute("code", code);//执行发送验证码if(emailService.sendEmail(toEmail, "验证码","欢迎注册,您的验证码为:"+code)) {return "获取成功";}return "获取失败";}

//邮箱接收到的验证码与输入的验证码进行比较

@RequestMapping("checkEmailCode")@ResponseBodypublic String checkEmailCode(String code,HttpSession httpSession) {String emailCode = httpSession.getAttribute("code").toString();if(emailCode!=null) {if(emailCode.equals(code)) {return "校验成功";}}return "校验失败";}

前端

//输入框–按钮

<input name="name" type="text" placeholder="邮箱" id="usernameid" />
<input name="code" type="text" placeholder="邮箱" id="codeid" /><input type="button" id="btn-get" value="获取验证码" onclick="doGetEmailCode()" />
<input type="button" id="btn-compare" value="验证验证码" onclick="doCompareEmailCode()" />

//发送验证码

function doGetEmailCode() {var email = $("#usernameid").val();//获取接收验证码的邮箱var url = "getEmailCode?toEmail=" + email;//地址与邮箱拼接$.get(url, function(result) {console.log("result", result); });
} 

//验证验证码

function doCompareEmailCode() {var codeid = $("#codeid").val();var url = "checkEmailCode?code=" + codeid;$.get(url, function(result) {console.log(result);});
}

附件其他邮件

#附件信息
spring:freemarker:template-loader-path: classpath:/templates/suffix: .ftlcache: falsecharset: UTF-8check-template-location: truecontent-type: text/htmlmail:host: smtp.163.com #发送邮件服务器username: test@163.com #发送邮件的邮箱地址password: SMSRDEQCIUKYODOR #客户端授权码,不是邮箱密码,网易的是自己设置的properties.mail.smtp.port: 465 #465或者994properties.mail.smtp.auth: 465properties.mail.smtp.ssl.enable: trueproperties.mail.starttls.enable: trueproperties.mail.starttls.required: truefrom: test@163.com # 发送邮件的地址,和上面username一致default-encoding: UTF-8#以下可以配置或者不配置#    properties:#      mail:#        smtp:#          port: 465 #端口号465994#          auth: true#        starttls:#          enable: true#          required: true

verifyCode.ftl配置文件

<p><strong style="color: #000000; font-size: 24px;">亲爱的外规数据平台用户:</strong></p>
<p>您好!</p>
<p>您已成功提交注册信息 ,请在验证码输入框中输入:<b style="color: red">${verifyCode}</b>以完成注册</p>

service

package *.comm.service;public interface IMailService {/*** 发送文本邮件** @param to      收件人* @param subject 主题* @param content 内容*/void sendSimpleMail(String to, String subject, String content);/*** 发送HTML邮件** @param to      收件人* @param subject 主题* @param content 内容*/void sendHtmlMail(String to, String subject, String content);/*** 发送带附件的邮件** @param to       收件人* @param subject  主题* @param content  内容* @param filePath 附件*/void sendAttachmentsMail(String to, String subject, String content, String filePath);/*** 发送模板邮件** @param to       收件人* @param subject  主题* @param fileName 邮件模板文件名称* @param model    邮件数据载体*/void sendModelMail(String to, String subject, String fileName, Object model);}

implement

package *.comm.service.impl
import *.comm.service.IMailService;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.FileSystemResource;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;
import org.springframework.ui.freemarker.FreeMarkerTemplateUtils;import javax.annotation.Resource;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.io.IOException;
import java.util.Objects;@Slf4j
@Service
public class IMailServiceImpl implements IMailService {/*** Spring Boot 提供了一个发送邮件的简单抽象,使用的是下面这个接口,这里直接注入即可使用*/@AutowiredJavaMailSender mailSender;@AutowiredConfiguration configuration;/*** 配置文件中我的qq邮箱*/@Value("${spring.mail.from}")private String from;/*** 简单文本邮件** @param to      收件人* @param subject 主题* @param content 内容*/@Overridepublic void sendSimpleMail(String to, String subject, String content) {//创建SimpleMailMessage对象SimpleMailMessage message = new SimpleMailMessage();//邮件发送人message.setFrom(from);message.setCc(from);//邮件接收人message.setTo(to);//邮件主题message.setSubject(subject);//邮件内容message.setText(content);//发送邮件mailSender.send(message);}/*** html邮件** @param to      收件人* @param subject 主题* @param content 内容*/@Overridepublic void sendHtmlMail(String to, String subject, String content) {//获取MimeMessage对象MimeMessage message = mailSender.createMimeMessage();MimeMessageHelper messageHelper;try {messageHelper = new MimeMessageHelper(message, true);//邮件发送人messageHelper.setFrom(from);//邮件接收人messageHelper.setTo(to);//邮件主题message.setSubject(subject);//邮件内容,html格式messageHelper.setText(content, true);//发送mailSender.send(message);//日志信息log.info("邮件已经发送...");} catch (MessagingException e) {log.error("发送邮件时发生异常!", e);}}/*** 带附件的邮件** @param to       收件人* @param subject  主题* @param content  内容* @param filePath 附件*/@Overridepublic void sendAttachmentsMail(String to, String subject, String content, String filePath) {MimeMessage message = mailSender.createMimeMessage();try {MimeMessageHelper helper = new MimeMessageHelper(message, true);helper.setFrom(from);helper.setTo(to);helper.setSubject(subject);helper.setText(content, true);//FileSystemResource file = new FileSystemResource(new File(filePath));ClassPathResource resource = new ClassPathResource(filePath);FileSystemResource file = new FileSystemResource(resource.getFile());helper.addAttachment(Objects.requireNonNull(file.getFilename()), file);//可以同时添加多个附件,只需要在这里直接添加第2,第3...附件就行了.//helper.addAttachment(fileName2, file2);mailSender.send(message);//日志信息log.info("邮件已经发送...");} catch (MessagingException e) {log.error("发送邮件时发生异常!", e);} catch (IOException e) {e.printStackTrace();log.error("发送邮件时发生异常!", e);}}@Overridepublic void sendModelMail(String to, String subject, String fileName, Object model) {MimeMessage mimeMessage = mailSender.createMimeMessage();try {MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);helper.setFrom(from);helper.setTo(to);helper.setSubject(subject);Template template = configuration.getTemplate(fileName);String html = FreeMarkerTemplateUtils.processTemplateIntoString(template, model);helper.setText(html, true);mailSender.send(mimeMessage);//日志信息log.info("邮件已经发送...");} catch (MessagingException e) {log.error("发送邮件时发生异常!", e);} catch (TemplateException e) {e.printStackTrace();log.error("发送邮件时发生异常!", e);} catch (IOException e) {e.printStackTrace();}}}

controller
这边用的redis 如果不用同上

package *.comm.controller;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil;
import *.comm.constant.CommConstant;
import *.comm.model.MailModel;
import *.comm.service.IMailService;
import *.common.request.comm.SysUserVerifyCodeReq;
import *.common.utils.Response;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.*;import java.util.concurrent.TimeUnit;@RestController
@Api(value = "邮件模块", description = "邮件模块", tags = "邮件模块")
@RequestMapping("/comm/mail/user")
public class TMailController {@AutowiredIMailService iMailService;@AutowiredRedisTemplate redisTemplate;@PostMapping("/verifyCode")@ApiOperation(value = "获取邮箱验证码", notes = "获取邮箱验证码")public Response sendVerifyCode(@RequestBody SysUserVerifyCodeReq sysUserVerifyCodeReq) {Response response = new Response();String key = CommConstant.USER_VERIFY_CODE + sysUserVerifyCodeReq.getUsername();String verifyCode = (String) redisTemplate.opsForValue().get(key);if (StrUtil.isNotBlank(verifyCode)) {response.setCode(200);response.setErr_msg("请勿重复获取");return response;}String value = RandomUtil.randomNumbers(6);redisTemplate.opsForValue().set(key, value, 3L, TimeUnit.MINUTES);String mail = sysUserVerifyCodeReq.getMail();MailModel mailModel = new MailModel();mailModel.setVerifyCode(value);iMailService.sendModelMail(mail,"系统验证码","verifyCode.ftl",mailModel);response.setCode(200);return response;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/5685.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

引入QQ邮箱发送验证码进行安全校验

其他方案>引入短信服务发送手机验证码进行安全校验 操作相对复杂且收费&#xff0c;详细教程可供参考选择 在我们进行登录注册等等敏感操作时&#xff0c;为了保证用户信息的安全性&#xff0c;常常会碰到需要接收手机短信验证码进行验证的场景&#xff0c;虽然它的安全系数…

ChatGPT与教育的未来

Datawhale干货 作者&#xff1a;王鹏&#xff0c;腾讯研究院专家 来源&#xff1a;数说职教 历史上&#xff0c;每一次技术替代人类时&#xff0c;又提供了更多更好的新岗位。但我们往往忘记这个过程中牺牲掉的一代甚至几代人。教育系统的响应方式和速度也许将决定这个替代过程…

万字知识长文:ChatGPT 从零完全上手实操指南

ChatGPT 的横空出世&#xff0c;让很多人焦虑不已&#xff0c;不过&#xff0c;你完全不需要为此焦虑&#xff0c;因为比 AI 更强大永远是驾驭 AI 为自己所用的人类。 而且 GPT 远没有各大商家炒作的那么玄乎 &#xff0c;它应用逻辑也非常简单&#xff0c;你完全没必要为此去…

玩转ChatGPT:吴恩达/OpenAI合作教程《面向开发者的ChatGPT提示工程》

一、写在前面 最近&#xff0c;吴恩达与CloseOpenAI合作出了一个教程《面向开发者的ChatGPT提示工程》&#xff0c;第一时间就观摩了&#xff0c;有些体会&#xff0c;现在把个人觉得有意思的搬运过来。 我的机器学习入门就是看的吴恩达的教程&#xff01;大佬长得像冯巩&…

Android多语言切换

先看下demo中点击对应要显示语言的按钮&#xff0c;效果图如下&#xff1a; 先贴上项目目录图&#xff1a; values-语言代号-地区代号 分别表示不同地区语言资源&#xff0c;常用的国际化资源如下&#xff1a; 中文&#xff08;中国&#xff09;&#xff1a;values-zh-rCN 中…

Android国际化多语言切换

关于App国际化&#xff0c;之前有讲到国际化资源、字符换、布局相关&#xff0c;想要了解的猛戳用力抱一下APP国际化。借着本次重构多语言想跟大家聊一下多语言切换&#xff0c;多语言切换对于一款国际化App来讲是重中之重&#xff0c;并非难事&#xff0c;但是若要做好也是一件…

几个chatGPT的难题,关于语言转换

不同语言代码的移植一直以来是程序员面临的难题&#xff0c;最近问了问chatGPT能否解决这个问题。 编写一个程序&#xff0c;实现c语言函数转换为php函数 答&#xff1a;这是一个非常困难的问题&#xff0c;因为两种语言的语法、结构和标准库都不相同。如果您希望完成这个任务&…

使用 ChatGPT 从视频脚本创建知识图谱,使用 GPT-4 作为领域专家来帮助您从视频转录中提取知识(教程含完整源码)

我一直很喜欢深海纪录片,因为这里的生态系统和动物与陆地上的大不相同。因此,我决定在水下纪录片上测试 GPT-4 的信息提取能力。此外,我不知道有任何开源 NLP 模型经过训练可以检测海洋植物和生物之间的关系。因此,一部深海纪录片是使用 GPT-4 构建知识图谱的绝佳示例。 数…

ChatGPT实战:短视频文案、脚本创作

你还在拼脑力输出视频脚本吗&#xff1f;AI时代&#xff0c;该提高提高生产力了&#xff0c;机器一天的视频出货量能赶上以往几个月的工作量&#xff0c;人力怎么可能卷的过机器&#xff1f; 使用ChatGPT创作视频脚本可以带来一些好处&#xff1a; 创意激发&#xff1a;ChatGPT…

玩转#ChatGPT之“用Chat GPT 做美食攻略”

ChatGPT是一个大型的语言模型&#xff0c;可以利用其强大的自然语言处理能力来帮助你进行美食攻略。 首先&#xff0c;你需要提供相应地区的美食相关信息&#xff0c;比如当地的名菜、特色小吃、饮食文化等。然后&#xff0c;你可以向ChatGPT提出问题&#xff0c;例如&#xf…

如何使用ChatGPT做一份五一出游攻略?

五一假期即将来临&#xff0c;或许你已经着手计划这个假期的旅游行程了呢&#xff1f; 但是若是缺乏旅游行程规划的经验&#xff0c;或者在选择质量上良莠不齐的攻略时感到困惑&#xff0c;你可以尝试使用ChatGPT来创建一份自己的旅游攻略哦&#xff01; 首先&#xff0c;我们…

如何高效使用ChatGPT

随着ChatGPT的不断推广&#xff0c;许多人在使用时都会遇到一个问题&#xff1a;ChatGPT给出的回答不是我想要的答案。这也是我们早期接触ChatGPT时会遇到的状况——用得“不太好”。 在对ChatGPT不断地探索、尝试以及查阅官方资料后&#xff0c;我们找到了一个突破点。ChatGP…

假期出行小程序+chatgpt旅游攻略

马上五一了,如果想出去旅游,需要提取规划好路线图,我们可以借助chatgpt的路线规划功能帮我们生成一份攻略,按照攻略我们就可以愉快的出去玩耍了。 本文结合chatgpt,利用低代码工具帮我们制作一份旅行导览小程序,可以按照行程方便的出行。 1 制定攻略 我们在聊天窗口输…

快速解决无法登录网页版微信的问题,亲测有效

在公司开发测试阶段&#xff0c;需要使用网页版微信对开发页面进行调试&#xff0c;但是我的两个微信号在扫码登录网页版微信时&#xff0c;都出现了以下提示&#xff1a; 为了你的帐号安全&#xff0c;此微信号不能登录网页微信。你可以使用Windows微信或Mac微信在电脑端登录。…

ChatGPT修bug横扫全场,准确率达78%!程序员该开心还是难过?

金磊 衡宇 发自 凹非寺量子位 | 公众号 QbitAI ChatGPT到底有多会修bug&#xff1f; 这事终于有人正儿八经地搞研究了—— 来自德国、英国的研究人员&#xff0c;专门搭了个“擂台”来检验ChatGPT的这项本领。 除了ChatGPT之外&#xff0c;研究人员还找来了其它三位修bug的“AI…

vue3.0仿写百度分页组件 chatgpt优化版

我写的<template><div class"paginations" v-iftotalItems > 0><button click"changePage(1)" >首页</button><button click"changePage(currentPage - 1)" :disabled"currentPage 1" :class"{ …

ChatGPT目前优化现状

文章目录 复习一下什么是ChatGPT一、目前优化的项&#xff08;使用中的感受&#xff09;二、结合上下文三、断层连续性四、知识跟进总结 复习一下什么是ChatGPT ChatGPT是基于OpenAI的GPT-3.5架构的语言模型&#xff0c;旨在提供广泛的语言理解和生成能力。它通过训练大量的文…

ChatGPT + 低代码,将干掉 40% 的程序员

见字如面&#xff0c;我是军哥&#xff01; 关于程序员失业有个段子&#xff1a;拖拽建站出来的时候&#xff0c;他们人说程序员会失业&#xff1b;低代码出来了&#xff0c;他们说程序员会失业&#xff1b;Copilot出来了&#xff0c;他们说程序员会失业&#xff1b;如今ChatGP…

Java的Idea怎么用ChatGpt,让些代码变丝滑?

发现两款idea的AI插件神器&#xff0c;和一个AI编辑器 1、tabnine https://zhuanlan.zhihu.com/p/343938113 当提示代码出现后&#xff0c;其中 按tab键就可以通用提示出的代码了&#xff0c;alt[ 是换提示代码&#xff0c;试用期限为14天。&#xff08;注意标红的&#xff0…

ChatGPT优化Python代码的小技巧

使用 chatGPT 优化代码并降低运行时的云成本 许多开发人员说“过早的优化是万恶之源”。 这句话的来源归功于Donald Knuth。在他的书《计算机编程的艺术》中&#xff0c;他写道&#xff1a; “真正的问题是&#xff0c;程序员在错误的时间和错误的地方花费了太多时间来担心效率…