Java郵箱驗證碼工具類的使用和校驗註冊

Java郵箱驗證碼工具類的使用和校驗註冊

1. 步驟和工具類

首先需要準備的東西 我這裏以QQ郵箱爲例。

  1. 點擊 設置 ->賬戶,找到這個頁面:

image-20200616230717936

  1. 拿到授權碼 並保存好:

image-20200616230755407

  1. 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):

image-20200617095450407

  • MailUtil.java 簡單優化(只需要修改 myEmail16位郵箱授權碼 即可)。
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","發送的信息");
    }
}

3. 測試截圖

image-20200617100406306

image-20200617100423920

image-20200617100507503

image-20200617100541261

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章