java實戰(zhàn)案例之用戶注冊并發(fā)送郵件激活/發(fā)送郵件驗證碼
一、前期準備
1、準備兩個郵箱賬號(一個發(fā)郵件,一個收郵件)
1.1)登錄需要發(fā)送郵件的QQ郵箱,找到設(shè)置項
1.2)然后在賬戶欄下,找到(POP3/SMTP)服務(wù)協(xié)議

1.3)生成授權(quán)碼
下拉找到 POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服務(wù) 打開 POP3/SMTP服務(wù),并記住授權(quán)碼,后面發(fā)送郵件時會用到授權(quán)碼

二、項目
1、準備用戶數(shù)據(jù)表
CREATE TABLE `user` ( `userid` int(20) NOT NULL AUTO_INCREMENT COMMENT '用戶編號', `name` varchar(16) DEFAULT NULL COMMENT '姓名', `password` varchar(16) DEFAULT '' COMMENT '密碼', `sex` varchar(12) DEFAULT NULL COMMENT '性別', `idno` varchar(18) DEFAULT NULL COMMENT '身份證號碼', `tel` int(11) DEFAULT NULL COMMENT '手機號碼', `userVerificationCode` int(6) DEFAULT NULL COMMENT '驗證碼', `userActivationCode` varchar(255) DEFAULT NULL COMMENT '激活碼', `eml` varchar(255) DEFAULT '' COMMENT '郵箱', `vipid` int(1) DEFAULT 0 COMMENT '會員等級', `permissionid` int(1) DEFAULT 0 COMMENT '權(quán)限等級', `registerdata` datetime DEFAULT NULL COMMENT '注冊日期', `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)建項目
2.1)在項目的pom表中導入郵件jar包
<!--引入郵件 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency>
為了使項目能夠跑通測試,以下是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,使得框架的使用更加簡化
原則: "開箱即用"
parent主要的作用:
1.SpringBoot在內(nèi)部兼容了當下幾乎所有的第三方框架
2.SpringBoot官網(wǎng)已經(jīng)將所有兼容的版本進行了定義
(幾乎解決了版本沖突問題)以后幾乎不寫版本號
概括: parent標簽中管理其他的項目版本信息.
-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.3</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<!--坐標-->
<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>
<!--跳過測試類打包-->
<skipTests>true</skipTests>
</properties>
<!--原則: 按需導入 -->
<dependencies>
<dependency>
<!--springboot啟動項(器)在包的內(nèi)部SpringBoot
已經(jīng)完成了項目的"整合"(配置) 用戶拿來就用
web導入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ù)庫驅(qū)動 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!--springBoot數(shù)據(jù)庫連接 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!--導入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項目與Maven整合的一個插件
可以通過插件 執(zhí)行項目打包/測試/文檔生成等操作
注意事項: 該插件不能省略
項目發(fā)布時: java -jar xxxx.jar 報錯:沒有主清單信息!!!!
-->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork><!--熱部署必須添加這個配置-->
</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---自動創(chuàng)建get、set等方法
@NoArgsConstructor //lombok---無參構(gòu)造
@AllArgsConstructor //lombok---全參構(gòu)造
@Accessors(chain = true) //開啟鏈式編程
@TableName("user") //關(guān)聯(lián)數(shù)據(jù)表--user表的名字
public class User {
//主鍵自增
@TableId(type= IdType.AUTO)
private Integer userid; //登錄賬號
private String name; //姓名
private String password; //密碼
private String repassword; //確認密碼
private String sex; //性別
private String idno; //身份證號碼
private Integer userVerificationCode; //驗證碼
private Integer userActivationCode; //激活碼
private String eml; //郵箱
private String tel; //聯(lián)系電話
private Integer vipid; //vip標志id
private Integer permissionid; //權(quán)限標志id
private boolean status; //狀態(tài):0 未激活 1激活
//日期出參格式化
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
private Timestamp registerdata; //注冊時間
@TableField(exist = false) //不是數(shù)據(jù)表格中固有的屬性
private String vipname; //vip標志名稱
@TableField(exist = false) //不是數(shù)據(jù)表格中固有的屬性
private String permissionname; //權(quán)限標志名稱
}
2.3)創(chuàng)建配置文件
server:
port: 8090
spring:
#連接數(shù)據(jù)數(shù)據(jù)庫
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ù)庫密碼以數(shù)字0開頭 則必須使用""號包裹
#password: "01234"
#連接發(fā)送者郵箱
mail:
host: smtp.qq.com #這個是QQ郵箱的,發(fā)件人郵箱的 SMTP 服務(wù)器地址, 必須準確, 不同郵件服務(wù)器地址不同, 一般(只是一般, 絕非絕對)格式為: smtp.xxx.com,可以百度
username: Xxx@qq.com #qq郵箱
password: #qq郵箱授權(quán)碼
protocol: smtp #發(fā)送郵件協(xié)議
properties.mail.smtp.auth: true #設(shè)置是否需要認證,如果為true,那么用戶名和密碼就必須的,
properties.mail.smtp.starttls.enable: true
properties.mail.smtp.starttls.required: true
properties.mail.smtp.ssl.enable: true #開啟SSL
default-encoding: utf-8
#SpringBoot整合MP配置
mybatis-plus:
#定義別名包: 實現(xiàn)對象映射
type-aliases-package: com.demo.pojo
#加載映射文件一個接口對應(yīng)一個映射文件
mapper-locations: classpath:/mybatis/*.xml
#開啟駝峰映射
configuration:
map-underscore-to-camel-case: true
#不打印日志
debug: false
#Mapper接口執(zhí)行 打印Sql日志
logging:
level:
com.jt.mapper: debug
2.3.1)郵件的配置文件,application.yml寫法
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 #開啟認證
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 #開啟SSL
default-encoding: utf-8
#from: xx@qq.com #發(fā)送者郵箱
2.3.2)郵件的配置文件,application.properties寫法
spring.mail.host=smtp.qq.com //這個是QQ郵箱的 其他郵箱請另行百度 spring.mail.username=用戶名 //發(fā)送方的郵箱 spring.mail.password=密碼 //對于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//接受請求
@CrossOrigin //解決跨域
@RequestMapping("/email") //訪問路徑
public class EmailController{
//注入對象
@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("驗證-郵箱發(fā)送的驗證碼。。。。");
return emailService.verificationEmail(user);
}
}
2.5)創(chuàng)建EmailService 類
package com.demo.service;
import com.demo.pojo.User;
public interface EmailService {
//發(fā)送驗證碼
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 {
//定義驗證碼
private Integer userVerificationCode = null;
@Autowired
JavaMailSender jms;
//讀取配置文件郵箱賬號參數(shù)
@Value("${spring.mail.username}")
private String sender;
//發(fā)送驗證碼
@Override
public String sendEmail(User user) {
//隨機數(shù)用作驗證
Integer userVerificationCode = new Random().nextInt(999999);
try {
//建立郵件消息
SimpleMailMessage mainMessage = new SimpleMailMessage();
//發(fā)送者
mainMessage.setFrom(sender);
//接收者
mainMessage.setTo(user.getEml());
//發(fā)送的標題
mainMessage.setSubject("郵箱驗證");
//發(fā)送的內(nèi)容
String msg = "您好!" + user.getEml() + ",您正在使用郵箱驗證,驗證碼:" + userVerificationCode + "。";
mainMessage.setText(msg);
//發(fā)送郵件
jms.send(mainMessage);
//下面是加入緩存,以便于進行郵箱驗證
this.userVerificationCode = userVerificationCode;
} catch (Exception e) {
return ("發(fā)送郵件失敗,請核對郵箱賬號");
}
return "驗證碼已經(jīng)發(fā)送您的郵箱,請前去郵箱查看,驗證碼是:" + userVerificationCode ;
}
@Override
public String verificationEmail(User user) {
if (this.userVerificationCode.equals(user.getUserVerificationCode())){
return "驗證成功";
}
return "驗證失敗";
}
}
3、準備網(wǎng)頁
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>郵箱驗證測試</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請求數(shù)據(jù)
type: "POST", //POST隱藏請求自帶的數(shù)據(jù),get顯示請求自帶的數(shù)據(jù)
url: "http://localhost:8080/fkxinli/register", //要使用的請求路徑
//contentType: "application/json;charset=utf-8",
data:$("#f1").serialize(),
success: function(data) { //成功時的方案
document.write(data);
},
error: function(data) {
//alert("返回失敗");
//console.log("注冊失敗");
}
})
}
function sendEmail(){
$.ajax({ //發(fā)起Ajax請求數(shù)據(jù)
type: "POST", //POST隱藏請求自帶的數(shù)據(jù),get顯示請求自帶的數(shù)據(jù)
url: "http://localhost:8090/email/sendEmail", //要使用的請求路徑
//contentType: "application/json;charset=utf-8",
data:$("#f1").serialize(),
success: function(data) { //成功時的方案
alert(data);
},
error: function(data) {
//alert("返回失敗");
//console.log("注冊失敗");
}
})
}
function verificationEmail(){
$.ajax({ //發(fā)起Ajax請求數(shù)據(jù)
type: "POST", //POST隱藏請求自帶的數(shù)據(jù),get顯示請求自帶的數(shù)據(jù)
url: "http://localhost:8090/email/verificationEmail", //要使用的請求路徑
//contentType: "application/json;charset=utf-8",
data:$("#f1").serialize(),
success: function(data) { //成功時的方案
alert(data);
},
error: function(data) {
//alert("返回失敗");
//console.log("注冊失敗");
}
})
}
<!--返回首頁-->
function returnfrontpage(){
window.open("../1-homepage/frontpage.html")
}
</script>
</head>
<body>
<h1 align="center">郵箱驗證測試</h1>
<form id="f1">
<table align="center">
<tr>
<td>電子郵箱:</td>
<td>
<input type="email" name="eml" placeholder="請輸入電子郵箱"/>
<input type="button" value="發(fā)送驗證碼" onclick="sendEmail()" />
</td>
</tr>
<tr>
<td>郵箱驗證碼:</td>
<td>
<input type="text" name="userVerificationCode" placeholder="請輸入郵箱驗證碼"/>
<input type="button" value="驗證--郵箱發(fā)送的驗證碼" onclick="verificationEmail()" />
</td>
</tr>
</table>
</form>
</body>
</html>
4、測試
后端代碼,寫的比較簡單,僅僅測試郵箱是否能夠發(fā)送驗證碼



總結(jié)
到此這篇關(guān)于java用戶注冊并發(fā)送郵件激活/發(fā)送郵件驗證碼的文章就介紹到這了,更多相關(guān)java用戶注冊發(fā)送郵件激活內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java并發(fā)編程之代碼實現(xiàn)兩玩家交換裝備
- Java并發(fā)編程之阻塞隊列(BlockingQueue)詳解
- JAVA并發(fā)圖解
- java并發(fā)編程JUC CountDownLatch線程同步
- Java并發(fā)之Condition案例詳解
- java并發(fā)編程之ThreadLocal詳解
- Java 處理高并發(fā)負載類優(yōu)化方法案例詳解
- 淺談Java高并發(fā)解決方案以及高負載優(yōu)化方法
- Java httpClient連接池支持多線程高并發(fā)的實現(xiàn)
- Java中常見的并發(fā)控制手段淺析
- Java之Rsync并發(fā)遷移數(shù)據(jù)并校驗詳解
- Java面試題沖刺第二十四天--并發(fā)編程
- Java 模擬真正的并發(fā)請求詳情
相關(guān)文章
從SpringBoot打war包并配置外部Tomcat運行的全流程
由于其他原因,我們需要使用SpringBoot打成war包放在外部的Tomcat中運行,本文就以一個案例來說明從SpringBoot打war包到Tomcat配置并運行的全流程經(jīng)過,需要的朋友可以參考下2024-06-06
Spring Security OAuth2集成短信驗證碼登錄以及第三方登錄
這篇文章主要介紹了Spring Security OAuth2集成短信驗證碼登錄以及第三方登錄,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-04-04
詳解Spring注解@Autowired的實現(xiàn)原理和使用方法
在使用Spring開發(fā)的時候,配置的方式主要有兩種,一種是xml的方式,另外一種是 java config的方式,在使用的過程中,我們使用最多的注解應(yīng)該就是@Autowired注解了,所以本文就給大家講講@Autowired注解是如何使用和實現(xiàn)的,需要的朋友可以參考下2023-07-07
java編程調(diào)用存儲過程中得到新增記錄id號的實現(xiàn)方法
這篇文章主要介紹了java編程調(diào)用存儲過程中得到新增記錄id號的實現(xiàn)方法,涉及Java數(shù)據(jù)庫操作中存儲過程的相關(guān)使用技巧,需要的朋友可以參考下2015-10-10
springboot多環(huán)境配置方案(不用5分鐘)
這篇文章主要介紹了springboot多環(huán)境配置方案(不用5分鐘),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-01-01

