Java郵箱驗證碼工具類的使用和校驗註冊
1. 步驟和工具類
首先需要準備的東西 我這裏以QQ郵箱爲例。
- 點擊
設置
->賬戶
,找到這個頁面:
- 拿到授權碼 並保存好:
- MailUtil 工具類:
package com.mailtest.demo;
import javax.mail.*;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties;
public class MailUtil {
public static void main(String[] args) {
sendMail("郵件接收者@qq.com","發送的信息");
}
/**
* 外網郵件發送
*
* @param to
* @param code
*/
public static void sendMail(String to, String code) {
String myEmailAddr = "郵件發送者@qq.com";
// Session對象:
Properties props = new Properties();
props.setProperty("mail.smtp.host", "smtp.qq.com"); // 設置主機地址
// smtp.163.com
// smtp.qq.com
// smtp.sina.com
props.setProperty("mail.smtp.auth", "true");// 認證
// 2.產生一個用於郵件發送的Session對象
Session session = Session.getInstance(props);
// Message對象:
Message message = new MimeMessage(session);
// 設置發件人:
try {
// 4.設置消息的發送者
Address fromAddr = new InternetAddress(myEmailAddr);
message.setFrom(fromAddr);
// 5.設置消息的接收者 nkpxcloxbtpxdjai
Address toAddr = new InternetAddress(to);
// TO 直接發送 CC抄送 BCC密送
message.setRecipient(MimeMessage.RecipientType.TO, toAddr);
// 6.設置主題
message.setSubject("來自*****系統的驗證碼");
// 7.設置正文
message.setContent("這裏是郵件的正文信息\n\n您的驗證碼爲:" + code, "text/html;charset=UTF-8");
// 8.準備發送,得到火箭
Transport transport = session.getTransport("smtp");
// 9.設置火箭的發射目標
//transport.connect("smtp.163.com", "發送者@163.com", "biao********");
transport.connect("smtp.qq.com", myEmailAddr, "jxzk*******");//jxzk..這個就是你的授權碼
// 10.發送
transport.sendMessage(message, message.getAllRecipients());
// Transport對象:
// Transport.send(message);
} catch (AddressException e) {
e.printStackTrace();
} catch (MessagingException e) {
e.printStackTrace();
}
}
}
2. 郵件驗證碼註冊demo
源碼結構(使用 Maven 配置demo):
- MailUtil.java 簡單優化(只需要修改
myEmail
和16位郵箱授權碼
即可)。
package com.demo.utils;
import javax.mail.Address;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties;
public class MailUtil {
/**
* 外網郵件發送
*
* @param to 收件人郵箱地址 收件人@xx.com
* @param code 傳入的驗證碼
*/
public static void sendMail(String to, String code) {
String myEmail = "QQ郵箱@qq.com";
// Session對象:
Properties props = new Properties();
props.setProperty("mail.smtp.host", "smtp.qq.com"); // 設置主機地址
// smtp.163.com
// smtp.qq.com
// smtp.sina.com
props.setProperty("mail.smtp.auth", "true");// 認證
// 2.產生一個用於郵件發送的Session對象
Session session = Session.getInstance(props);
// Message對象:
Message message = new MimeMessage(session);
// 設置發件人:
try {
// 4.設置消息的發送者
Address fromAddr = new InternetAddress(myEmail);
message.setFrom(fromAddr);
// 5.設置消息的接收者 nkpxcloxbtpxdjai
Address toAddr = new InternetAddress(to);
// TO 直接發送 CC抄送 BCC密送
message.setRecipient(MimeMessage.RecipientType.TO, toAddr);
// 6.設置郵件標題
message.setSubject("來自 " + myEmail + " 的安全驗證碼");
// 7.設置正文
message.setContent("這裏是郵件的正文信息\n\n您的驗證碼爲:" + code, "text/html;charset=UTF-8");
// 8.準備發送,得到火箭
Transport transport = session.getTransport("smtp");
// 9.設置火箭的發射目標(第三個參數就是你的郵箱授權碼)
//transport.connect("smtp.163.com", "發送者@163.com", "abcdefghabcdefgh");
transport.connect("smtp.qq.com", myEmail, "16位授權碼");
// 10.發送
transport.sendMessage(message, message.getAllRecipients());
// Transport對象:
// Transport.send(message);
} catch (Exception e) {
e.printStackTrace();
}
}
public static String generateRandomCode(int length) {
String s = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
StringBuilder sb = new StringBuilder();
while (sb.length() < length) {
// 0 ~ s.length()-1
int index = (new java.util.Random()).nextInt(s.length());
// 處理重複字符:每個新的隨機字符在 sb 中使用indexOf()查找下標值,-1爲沒找到,即不重複
Character ch = s.charAt(index);
if (sb.indexOf(ch.toString()) < 0) {
sb.append(ch);
}
}
return sb.toString();
}
}
- pom.xml 配置依賴
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.demo</groupId>
<artifactId>mailTest</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<dependencies>
<!-- servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!-- jsp -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
<!-- mail -->
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.6.2</version>
</dependency>
<!-- log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!-- junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>RELEASE</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>
- register.jsp 簡陋但極速的註冊頁
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>郵箱驗證碼測試</title>
<script src="${pageContext.request.contextPath}/js/jquery-3.5.1.min.js"></script>
<script>
$(function () {
sendMail();
});
// 異步請求發送郵件
var code;
function sendMail() {
$("#sendMailBtn").click(function () {
var emailAddr = $("#emailAddr").val();
$.ajax({
type: "post",
url: "${pageContext.request.contextPath}/toSendMail",
async: false, //爲了拿到驗證碼返回,需使用同步,ajax 執行完,才 return code
data:{
"email": emailAddr
},
success: function (data) {
console.log("收到:" + data);
code = data;
},
});
$('#mailSpan').text("√ 郵件已發送!");
});
return code;
}
// form表單根據郵件驗證碼輸入是否一致,決定是否攔截提交
function checkAll() {
var code = $("input[name='mailCode']").val();
var sysCode = sendMail();
console.log(code + " === " + sysCode);
return sysCode === code;
}
</script>
</head>
<body>
<h2>Mailbox Verification:</h2>
<br>
<form action="${pageContext.request.contextPath}/register" method="post" onsubmit="return checkAll()">
賬號:<input type="text" name="username"/> <br><br>
密碼:<input type="password" name="password"/> <br><br>
郵箱:<input type="email" name="email" id="emailAddr"/>
<%-- 點擊按鈕進入異步請求,發送郵箱驗證碼 --%>
<input type="button" value="發送驗證碼" id="sendMailBtn">
<span id="mailSpan" style="color: green"></span><br><br>
郵箱驗證碼:<input type="text" name="mailCode"> <br><br>
<input type="submit" value="註冊" />
</form>
</body>
</html>
- SendMailServlet.java 生成並相應 郵箱驗證碼 到頁面
package com.demo.controller;
import com.demo.utils.MailUtil;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
import java.util.logging.Logger;
@WebServlet(name = "SendMailServlet", urlPatterns = "/toSendMail")
public class SendMailServlet extends javax.servlet.http.HttpServlet {
protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
String emailAddr = request.getParameter("email");
String randomCode = MailUtil.generateRandomCode(5);
MailUtil.sendMail(emailAddr, randomCode);
// 響應異步請求(內容爲郵箱驗證碼)
response.getWriter().write(randomCode);
Logger.getGlobal().info("郵件驗證碼已發送!");
}
protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
doPost(request, response);
}
}
- RegisterServlet.java 就一句,沒啥說的。
package com.demo.controller;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(name = "RegisterServlet", urlPatterns = "/register")
public class RegisterServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("register success!!!");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
- TestMail.java 測試類,你懂的。
package com.demo.test;
import com.demo.utils.MailUtil;
import org.junit.Test;
import static com.demo.utils.MailUtil.sendMail;
public class TestMail {
@Test
public void test() {
String emailAddr = "[email protected]";
// 生成驗證碼,參數爲 隨機驗證碼位數
String randomCode = MailUtil.generateRandomCode(5);
sendMail(emailAddr, randomCode);
//sendMail("郵件接收者@qq.com","發送的信息");
}
}