java實(shí)戰(zhàn)案例之用戶注冊(cè)并發(fā)送郵件激活/發(fā)送郵件驗(yàn)證碼
一、前期準(zhǔn)備
1、準(zhǔn)備兩個(gè)郵箱賬號(hào)(一個(gè)發(fā)郵件,一個(gè)收郵件)
1.1)登錄需要發(fā)送郵件的QQ郵箱,找到設(shè)置項(xiàng)
1.2)然后在賬戶欄下,找到(POP3/SMTP)服務(wù)協(xié)議
1.3)生成授權(quán)碼
下拉找到 POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服務(wù) 打開(kāi) POP3/SMTP服務(wù),并記住授權(quán)碼,后面發(fā)送郵件時(shí)會(huì)用到授權(quán)碼
二、項(xiàng)目
1、準(zhǔn)備用戶數(shù)據(jù)表
CREATE TABLE `user` ( `userid` int(20) NOT NULL AUTO_INCREMENT COMMENT '用戶編號(hào)', `name` varchar(16) DEFAULT NULL COMMENT '姓名', `password` varchar(16) DEFAULT '' COMMENT '密碼', `sex` varchar(12) DEFAULT NULL COMMENT '性別', `idno` varchar(18) DEFAULT NULL COMMENT '身份證號(hào)碼', `tel` int(11) DEFAULT NULL COMMENT '手機(jī)號(hào)碼', `userVerificationCode` int(6) DEFAULT NULL COMMENT '驗(yàn)證碼', `userActivationCode` varchar(255) DEFAULT NULL COMMENT '激活碼', `eml` varchar(255) DEFAULT '' COMMENT '郵箱', `vipid` int(1) DEFAULT 0 COMMENT '會(huì)員等級(jí)', `permissionid` int(1) DEFAULT 0 COMMENT '權(quán)限等級(jí)', `registerdata` datetime DEFAULT NULL COMMENT '注冊(cè)日期', `status` tinyint(1) DEFAULT NULL COMMENT '狀態(tài):0 未激活 1激活', PRIMARY KEY (`userid`) ) ENGINE=InnoDB AUTO_INCREMENT=1007 DEFAULT CHARSET=utf8
2、idea 創(chuàng)建項(xiàng)目
2.1)在項(xiàng)目的pom表中導(dǎo)入郵件jar包
<!--引入郵件 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency>
為了使項(xiàng)目能夠跑通測(cè)試,以下是pom表的所有配置
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <!-- 定位: SpringBoot主要的作用整合SSM,使得框架的使用更加簡(jiǎn)化 原則: "開(kāi)箱即用" parent主要的作用: 1.SpringBoot在內(nèi)部兼容了當(dāng)下幾乎所有的第三方框架 2.SpringBoot官網(wǎng)已經(jīng)將所有兼容的版本進(jìn)行了定義 (幾乎解決了版本沖突問(wèn)題)以后幾乎不寫(xiě)版本號(hào) 概括: parent標(biāo)簽中管理其他的項(xiàng)目版本信息. --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.5.3</version> <relativePath/> <!-- lookup parent from repository --> </parent> <!--坐標(biāo)--> <groupId>com.demo</groupId> <artifactId>yuyue</artifactId> <version>0.0.1-SNAPSHOT</version> <name>yuyue</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> <!--跳過(guò)測(cè)試類打包--> <skipTests>true</skipTests> </properties> <!--原則: 按需導(dǎo)入 --> <dependencies> <dependency> <!--springboot啟動(dòng)項(xiàng)(器)在包的內(nèi)部SpringBoot 已經(jīng)完成了項(xiàng)目的"整合"(配置) 用戶拿來(lái)就用 web導(dǎo)入SpringMVC --> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!--支持熱部署 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> </dependency> <!--添加lombok依賴--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <!--引入數(shù)據(jù)庫(kù)驅(qū)動(dòng) --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <!--springBoot數(shù)據(jù)庫(kù)連接 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <!--導(dǎo)入MP包之后,刪除原有的Mybatis的包 --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.3</version> </dependency> <!--引入郵件 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency> </dependencies> <!--SpringBoot項(xiàng)目與Maven整合的一個(gè)插件 可以通過(guò)插件 執(zhí)行項(xiàng)目打包/測(cè)試/文檔生成等操作 注意事項(xiàng): 該插件不能省略 項(xiàng)目發(fā)布時(shí): java -jar xxxx.jar 報(bào)錯(cuò):沒(méi)有主清單信息!!!! --> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <fork>true</fork><!--熱部署必須添加這個(gè)配置--> </configuration> </plugin> </plugins> </build> </project>
2.2)創(chuàng)建user類—用戶類
package com.demo.pojo; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.Accessors; import java.sql.Timestamp; @Data //lombok---自動(dòng)創(chuàng)建get、set等方法 @NoArgsConstructor //lombok---無(wú)參構(gòu)造 @AllArgsConstructor //lombok---全參構(gòu)造 @Accessors(chain = true) //開(kāi)啟鏈?zhǔn)骄幊? @TableName("user") //關(guān)聯(lián)數(shù)據(jù)表--user表的名字 public class User { //主鍵自增 @TableId(type= IdType.AUTO) private Integer userid; //登錄賬號(hào) private String name; //姓名 private String password; //密碼 private String repassword; //確認(rèn)密碼 private String sex; //性別 private String idno; //身份證號(hào)碼 private Integer userVerificationCode; //驗(yàn)證碼 private Integer userActivationCode; //激活碼 private String eml; //郵箱 private String tel; //聯(lián)系電話 private Integer vipid; //vip標(biāo)志id private Integer permissionid; //權(quán)限標(biāo)志id private boolean status; //狀態(tài):0 未激活 1激活 //日期出參格式化 @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") private Timestamp registerdata; //注冊(cè)時(shí)間 @TableField(exist = false) //不是數(shù)據(jù)表格中固有的屬性 private String vipname; //vip標(biāo)志名稱 @TableField(exist = false) //不是數(shù)據(jù)表格中固有的屬性 private String permissionname; //權(quán)限標(biāo)志名稱 }
2.3)創(chuàng)建配置文件
server: port: 8090 spring: #連接數(shù)據(jù)數(shù)據(jù)庫(kù) datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://127.0.0.1:3306/yuyue?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true username: root password: root #如果數(shù)據(jù)庫(kù)密碼以數(shù)字0開(kāi)頭 則必須使用""號(hào)包裹 #password: "01234" #連接發(fā)送者郵箱 mail: host: smtp.qq.com #這個(gè)是QQ郵箱的,發(fā)件人郵箱的 SMTP 服務(wù)器地址, 必須準(zhǔn)確, 不同郵件服務(wù)器地址不同, 一般(只是一般, 絕非絕對(duì))格式為: smtp.xxx.com,可以百度 username: Xxx@qq.com #qq郵箱 password: #qq郵箱授權(quán)碼 protocol: smtp #發(fā)送郵件協(xié)議 properties.mail.smtp.auth: true #設(shè)置是否需要認(rèn)證,如果為true,那么用戶名和密碼就必須的, properties.mail.smtp.starttls.enable: true properties.mail.smtp.starttls.required: true properties.mail.smtp.ssl.enable: true #開(kāi)啟SSL default-encoding: utf-8 #SpringBoot整合MP配置 mybatis-plus: #定義別名包: 實(shí)現(xiàn)對(duì)象映射 type-aliases-package: com.demo.pojo #加載映射文件一個(gè)接口對(duì)應(yīng)一個(gè)映射文件 mapper-locations: classpath:/mybatis/*.xml #開(kāi)啟駝峰映射 configuration: map-underscore-to-camel-case: true #不打印日志 debug: false #Mapper接口執(zhí)行 打印Sql日志 logging: level: com.jt.mapper: debug
2.3.1)郵件的配置文件,application.yml寫(xiě)法
spring: mail: host: smtp.qq.com #發(fā)送郵件服務(wù)器 username: xx@qq.com #發(fā)送者郵箱 password: xxxxxxxx #發(fā)送者郵箱授權(quán)碼 protocol: smtp #發(fā)送郵件協(xié)議 properties.mail.smtp.auth: true #開(kāi)啟認(rèn)證 properties.mail.smtp.port: 994 #設(shè)置端口465或者994 properties.mail.display.sendmail: aaa #可以任意 properties.mail.display.sendname: bbb #可以任意 properties.mail.smtp.starttls.enable: true properties.mail.smtp.starttls.required: true properties.mail.smtp.ssl.enable: true #開(kāi)啟SSL default-encoding: utf-8 #from: xx@qq.com #發(fā)送者郵箱
2.3.2)郵件的配置文件,application.properties寫(xiě)法
spring.mail.host=smtp.qq.com //這個(gè)是QQ郵箱的 其他郵箱請(qǐng)另行百度 spring.mail.username=用戶名 //發(fā)送方的郵箱 spring.mail.password=密碼 //對(duì)于qq郵箱而言 密碼指的就是發(fā)送方的授權(quán)碼 spring.mail.properties.mail.smtp.auth=true spring.mail.properties.mail.smtp.starttls.enable=true spring.mail.properties.mail.smtp.starttls.required=true
2.4)創(chuàng)建EmailController類
package com.demo.controller; import com.demo.pojo.User; import com.demo.service.EmailService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController//接受請(qǐng)求 @CrossOrigin //解決跨域 @RequestMapping("/email") //訪問(wèn)路徑 public class EmailController{ //注入對(duì)象 @Autowired private EmailService emailService; @PostMapping ("/sendEmail") public String sendEmail(User user){ System.out.println("發(fā)送郵件。。。。"); return emailService.sendEmail(user); } @PostMapping ("/verificationEmail") public String verificationEmail(User user){ System.out.println("驗(yàn)證-郵箱發(fā)送的驗(yàn)證碼。。。。"); return emailService.verificationEmail(user); } }
2.5)創(chuàng)建EmailService 類
package com.demo.service; import com.demo.pojo.User; public interface EmailService { //發(fā)送驗(yàn)證碼 String sendEmail(User user); }
2.6)創(chuàng)建EmailServiceImpl 類
package com.demo.service; import com.demo.pojo.User; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.mail.SimpleMailMessage; import org.springframework.mail.javamail.JavaMailSender; import org.springframework.stereotype.Service; import java.util.Random; @Service public class EmailServiceImpl implements EmailService { //定義驗(yàn)證碼 private Integer userVerificationCode = null; @Autowired JavaMailSender jms; //讀取配置文件郵箱賬號(hào)參數(shù) @Value("${spring.mail.username}") private String sender; //發(fā)送驗(yàn)證碼 @Override public String sendEmail(User user) { //隨機(jī)數(shù)用作驗(yàn)證 Integer userVerificationCode = new Random().nextInt(999999); try { //建立郵件消息 SimpleMailMessage mainMessage = new SimpleMailMessage(); //發(fā)送者 mainMessage.setFrom(sender); //接收者 mainMessage.setTo(user.getEml()); //發(fā)送的標(biāo)題 mainMessage.setSubject("郵箱驗(yàn)證"); //發(fā)送的內(nèi)容 String msg = "您好!" + user.getEml() + ",您正在使用郵箱驗(yàn)證,驗(yàn)證碼:" + userVerificationCode + "。"; mainMessage.setText(msg); //發(fā)送郵件 jms.send(mainMessage); //下面是加入緩存,以便于進(jìn)行郵箱驗(yàn)證 this.userVerificationCode = userVerificationCode; } catch (Exception e) { return ("發(fā)送郵件失敗,請(qǐng)核對(duì)郵箱賬號(hào)"); } return "驗(yàn)證碼已經(jīng)發(fā)送您的郵箱,請(qǐng)前去郵箱查看,驗(yàn)證碼是:" + userVerificationCode ; } @Override public String verificationEmail(User user) { if (this.userVerificationCode.equals(user.getUserVerificationCode())){ return "驗(yàn)證成功"; } return "驗(yàn)證失敗"; } }
3、準(zhǔn)備網(wǎng)頁(yè)
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>郵箱驗(yàn)證測(cè)試</title> <script src="../js/jquery-3.6.0.min.js"></script> <script src="../js/axios.js"></script> <script> function register(){ axios.post("http://localhost:8090/fkxinli/register", $("#f1").serialize()) .then(function(result){ console.log(result.data) }) } function register1(){ $.ajax({ //發(fā)起Ajax請(qǐng)求數(shù)據(jù) type: "POST", //POST隱藏請(qǐng)求自帶的數(shù)據(jù),get顯示請(qǐng)求自帶的數(shù)據(jù) url: "http://localhost:8080/fkxinli/register", //要使用的請(qǐng)求路徑 //contentType: "application/json;charset=utf-8", data:$("#f1").serialize(), success: function(data) { //成功時(shí)的方案 document.write(data); }, error: function(data) { //alert("返回失敗"); //console.log("注冊(cè)失敗"); } }) } function sendEmail(){ $.ajax({ //發(fā)起Ajax請(qǐng)求數(shù)據(jù) type: "POST", //POST隱藏請(qǐng)求自帶的數(shù)據(jù),get顯示請(qǐng)求自帶的數(shù)據(jù) url: "http://localhost:8090/email/sendEmail", //要使用的請(qǐng)求路徑 //contentType: "application/json;charset=utf-8", data:$("#f1").serialize(), success: function(data) { //成功時(shí)的方案 alert(data); }, error: function(data) { //alert("返回失敗"); //console.log("注冊(cè)失敗"); } }) } function verificationEmail(){ $.ajax({ //發(fā)起Ajax請(qǐng)求數(shù)據(jù) type: "POST", //POST隱藏請(qǐng)求自帶的數(shù)據(jù),get顯示請(qǐng)求自帶的數(shù)據(jù) url: "http://localhost:8090/email/verificationEmail", //要使用的請(qǐng)求路徑 //contentType: "application/json;charset=utf-8", data:$("#f1").serialize(), success: function(data) { //成功時(shí)的方案 alert(data); }, error: function(data) { //alert("返回失敗"); //console.log("注冊(cè)失敗"); } }) } <!--返回首頁(yè)--> function returnfrontpage(){ window.open("../1-homepage/frontpage.html") } </script> </head> <body> <h1 align="center">郵箱驗(yàn)證測(cè)試</h1> <form id="f1"> <table align="center"> <tr> <td>電子郵箱:</td> <td> <input type="email" name="eml" placeholder="請(qǐng)輸入電子郵箱"/> <input type="button" value="發(fā)送驗(yàn)證碼" onclick="sendEmail()" /> </td> </tr> <tr> <td>郵箱驗(yàn)證碼:</td> <td> <input type="text" name="userVerificationCode" placeholder="請(qǐng)輸入郵箱驗(yàn)證碼"/> <input type="button" value="驗(yàn)證--郵箱發(fā)送的驗(yàn)證碼" onclick="verificationEmail()" /> </td> </tr> </table> </form> </body> </html>
4、測(cè)試
后端代碼,寫(xiě)的比較簡(jiǎn)單,僅僅測(cè)試郵箱是否能夠發(fā)送驗(yàn)證碼
總結(jié)
到此這篇關(guān)于java用戶注冊(cè)并發(fā)送郵件激活/發(fā)送郵件驗(yàn)證碼的文章就介紹到這了,更多相關(guān)java用戶注冊(cè)發(fā)送郵件激活內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java并發(fā)編程之代碼實(shí)現(xiàn)兩玩家交換裝備
- Java并發(fā)編程之阻塞隊(duì)列(BlockingQueue)詳解
- JAVA并發(fā)圖解
- java并發(fā)編程JUC CountDownLatch線程同步
- Java并發(fā)之Condition案例詳解
- java并發(fā)編程之ThreadLocal詳解
- Java 處理高并發(fā)負(fù)載類優(yōu)化方法案例詳解
- 淺談Java高并發(fā)解決方案以及高負(fù)載優(yōu)化方法
- Java httpClient連接池支持多線程高并發(fā)的實(shí)現(xiàn)
- Java中常見(jiàn)的并發(fā)控制手段淺析
- Java之Rsync并發(fā)遷移數(shù)據(jù)并校驗(yàn)詳解
- Java面試題沖刺第二十四天--并發(fā)編程
- Java 模擬真正的并發(fā)請(qǐng)求詳情
相關(guān)文章
從SpringBoot打war包并配置外部Tomcat運(yùn)行的全流程
由于其他原因,我們需要使用SpringBoot打成war包放在外部的Tomcat中運(yùn)行,本文就以一個(gè)案例來(lái)說(shuō)明從SpringBoot打war包到Tomcat配置并運(yùn)行的全流程經(jīng)過(guò),需要的朋友可以參考下2024-06-06Spring Security OAuth2集成短信驗(yàn)證碼登錄以及第三方登錄
這篇文章主要介紹了Spring Security OAuth2集成短信驗(yàn)證碼登錄以及第三方登錄,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-04-04詳解Spring注解@Autowired的實(shí)現(xiàn)原理和使用方法
在使用Spring開(kāi)發(fā)的時(shí)候,配置的方式主要有兩種,一種是xml的方式,另外一種是 java config的方式,在使用的過(guò)程中,我們使用最多的注解應(yīng)該就是@Autowired注解了,所以本文就給大家講講@Autowired注解是如何使用和實(shí)現(xiàn)的,需要的朋友可以參考下2023-07-07java編程調(diào)用存儲(chǔ)過(guò)程中得到新增記錄id號(hào)的實(shí)現(xiàn)方法
這篇文章主要介紹了java編程調(diào)用存儲(chǔ)過(guò)程中得到新增記錄id號(hào)的實(shí)現(xiàn)方法,涉及Java數(shù)據(jù)庫(kù)操作中存儲(chǔ)過(guò)程的相關(guān)使用技巧,需要的朋友可以參考下2015-10-10springboot多環(huán)境配置方案(不用5分鐘)
這篇文章主要介紹了springboot多環(huán)境配置方案(不用5分鐘),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01