1. 程式人生 > >javaWeb實現郵箱驗證功能(二)

javaWeb實現郵箱驗證功能(二)

上篇寫的實現基本上是一個工具類,並沒封裝成下圖這樣方式(梨視訊註冊介面),現在開始完善上篇的java郵箱啟用驗證功。

java郵箱驗證地址:https://blog.csdn.net/BlackPlus28/article/details/85044068

-------------------------------------------------------------------------------------------------------------------

上篇已經實現傳送郵件這個功能,現在我把它寫成util類。

一、建立JavaMailUtil類(下面的程式碼是之前寫的Test類中的程式碼,直接複製過來即可)

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Date;
import java.util.UUID;

import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class JavaMailUtil {

	// 發件人的郵箱和密碼
	public static String emailAccount = "
[email protected]
"; // 發件人郵箱密碼(有的是授權碼) public static String emailPassword = "XXXXXXXXXX"; // 發件人郵箱服務地址 public static String emailSMTPHost = "smtp.qq.com"; // 收件人郵箱 public static String receiveMailAccount = ""; /** * 建立一封郵件(發件人、收件人、郵件內容) * @param session * @param sendMail * @param receiveMail * @param html * @return * @throws MessagingException * @throws IOException * cc:抄送 * Bcc:密送 * To:傳送 */ public static MimeMessage creatMimeMessage(Session session,String sendMail,String receiveMail,String html) throws MessagingException, IOException { // 1、建立一封郵件物件 MimeMessage message = new MimeMessage(session); // 2、From:發件人 message.setFrom(new InternetAddress(sendMail, "發件人暱稱", "UTF-8")); // 3、To:收件人(可以增加多個收件人:抄送或者密送) message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(receiveMail, "張三", "UTF-8")); // 4、Subject:郵件主題 message.setSubject("郵箱驗證","UTF-8"); // 5、Content:郵件正文(可以使用Html標籤) message.setContent(html,"text/html;charset=UTF-8"); // 6、設定傳送時間 message.setSentDate(new Date()); // 7、儲存設定 message.saveChanges(); // 8、將該郵件儲存在本地 OutputStream out = new FileOutputStream("D://MyEmail" + UUID.randomUUID().toString() + ".eml"); message.writeTo(out); out.flush(); out.close(); return message; } }

二、建立一個Html模組(就是郵件內容)

public class htmlText {
	//  返回頁面Html攜帶的6位隨機碼
	public static String html(String code) {
		
		String html = "Email地址驗證<br/>"+ 
		"這封郵件是由XXX購物商城傳送的。<br/>"+
		"你收到這封郵件是XXX購物商城進行新使用者註冊或者使用者修改Email使用這個地址。<br/>"+
		"賬號啟用宣告<br/>"+
		"你只將下面驗證碼輸入提示框即可:<h3 style='color:red;'>" + code + "</h3><br/>";
		return html;
	}
}

三、建立RandomUtil類(生成隨機碼)

public class RandomUtil {
	public static void main(String[] args) {
		// 控制檯列印
		System.out.println(RandomUtil.getRandom());
	}
	//  獲取6為隨機驗證碼
	public static String getRandom() {
		String[] letters = new String[] {
				"q","w","e","r","t","y","u","i","o","p","a","s","d","f","g","h","j","k","l","z","x","c","v","b","n","m",
				"A","W","E","R","T","Y","U","I","O","P","A","S","D","F","G","H","J","K","L","Z","X","C","V","B","N","M",
				"0","1","2","3","4","5","6","7","8","9"};
		String code ="";
		for (int i = 0; i < 6; i++) {
			code = code + letters[(int)Math.floor(Math.random()*letters.length)];
		}
		return code;
	}
}

四、建立register.jsp頁面(這裡只是測試功能,需要樣式的自行新增,用到了一點點JQuery,檔案放到原始碼中,自行獲取。)

<%@ page language="java" contentType="text/html; charset=utf-8"  pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>登入註冊介面</title>
<style type="text/css">
.table tr {
   border-collapse: collapse;
}
</style>
<script type="text/javascript" src="js/jquery-1.8.0.min.js"></script>
<script type="text/javascript">

$(function(){
	$("#btn").click(function(){
		if($(".email").val()){
					$.ajax({
						type:"POST",
						url :"SendEmailServlet?random"+Math.random(),
						data:{
							email:$(".email").val(),
						},
						success:function(data){
							alert("success");
						},
					})
		}else{
			alert("fail");
			$("#notice").html("請填寫郵箱");
			setTimeout(function(){
				$("#notice").hide();
			},1000);
		}
	});
	//  判斷使用者是否可以註冊
	$("#submit").click(function(){
		if($(".email").val()){
			$("#RegistForm").submit();
		}else{   //  如果沒有值
			$("#notice").html("請完整資訊");
			setTimeout(function(){
				$("#notice").hide();
			},1000);
		}
	});
});
</script>
</head>
<body>
<form action="${pageContext.request.contextPath}/RegistServlet" id="RegistForm"    method="post">
	<table width="300" border="1" class="table" >
		<tr>
			<td>使用者名稱:</td>
			<td><input type="text" name="username"></td>
		</tr>
		<tr>
			<td>密&nbsp;碼:</td>
			<td><input type="password" name="password"></td>
		</tr>
		<tr>
			<td>郵箱:</td>
			<td><input type="text" name="email" class="email"></td>
			<td>
				<input type="button" class="btn" id="btn" value="傳送郵箱驗證碼"/><br/>
			</td>
		</tr>
		<tr>
			<td>驗證碼:</td>
			<td><input type="text" name="code" class="code"></td>
		</tr>
		<span id="notice" class="hide">請先完成郵箱驗證</span><br/>
		<tr>
			<td colspan="2"><input type="submit" id="submit" value="註冊"></td>
		</tr>
	</table>
 </form>
</body>
</html>

五、建立fail.jsp和success.jsp 。程式碼就不貼了,裡面只有一句話,測試用,需要的,原始碼中自行獲取。

六、建立SendEmailServlet類

import com.itshenjin.html.htmlText;
import com.itshenjin.util.JavaMailUtil;
import com.itshenjin.util.RandomUtil;

import java.io.IOException;
import java.util.Properties;

import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.MimeMessage;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


/**
 * 傳送郵件 功能:
 * 
 * @author itshenjin
 * @author 2018年12月10日
 *
 */
@WebServlet("/SendEmailServlet")
public class SendEmailServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		try {
			String email = req.getParameter("email");
			JavaMailUtil.receiveMailAccount = email; // 給使用者輸入的郵箱傳送郵件

			// 1、建立引數配置,用於連線郵箱伺服器的引數配置
			Properties props = new Properties();
			// 開啟debug除錯
			props.setProperty("mail.debug", "true");
			// 傳送伺服器需要身份驗證
			props.setProperty("mail.smtp.auth", "true");
			// 設定右鍵伺服器的主機名
			props.setProperty("mail.host", JavaMailUtil.emailSMTPHost);
			// 傳送郵件協議名稱
			props.setProperty("mail.transport.protocol", "smtp");

			// 2、根據配置建立會話物件,用於和郵件伺服器互動
			Session session = Session.getInstance(props);
			// 設定debug,可以檢視詳細的傳送log
			session.setDebug(true);
			// 3、建立一封郵件
			String code = RandomUtil.getRandom();
			System.out.println("郵箱驗證碼:" + code);
			String html = htmlText.html(code);
			MimeMessage message = JavaMailUtil.creatMimeMessage(session, JavaMailUtil.emailAccount,
					JavaMailUtil.receiveMailAccount, html);

			// 4、根據session獲取郵件傳輸物件
			Transport transport = session.getTransport();
			// 5、使用郵箱賬號和密碼連線郵箱伺服器emailAccount必須與message中的發件人郵箱一致,否則報錯
			transport.connect(JavaMailUtil.emailAccount, JavaMailUtil.emailPassword);
			// 6、傳送郵件,傳送所有收件人地址
			transport.sendMessage(message, message.getAllRecipients());
			// 7、關閉連線
			transport.close();
			//  寫入session
			req.getSession().setAttribute("code", code);
		} catch (Exception e) {
			e.printStackTrace();
			req.getSession().setAttribute("error", "郵件傳送失敗");
		}
	}
}

七、建立RegistServlet類


import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 
 * 功能:傳送郵箱功能處理
 * @author itshenjin
 * @author 2018年12月11日
 *
 */
@WebServlet("/RegistServlet")
public class RegistServlet extends HttpServlet{
	private static final long serialVersionUID = 1L;
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		String sessionCode = (String) req.getSession().getAttribute("code");
		System.out.println(sessionCode);
		//  獲取session中的驗證碼
		if(sessionCode != null) {
			//  獲取頁面提交的驗證碼
			String inputCode = req.getParameter("code");
			System.out.println("頁面提交的驗證碼:" + inputCode);
			if (sessionCode.toLowerCase().equals(inputCode.toLowerCase())) {
				// 把使用者名稱和密碼等一系列資訊插入到資料庫中,這塊很簡單的邏輯,暫時沒寫,後續更新上
				String username = req.getParameter("username");
				String password = req.getParameter("password");
				
				//  驗證成功,跳轉成功頁面
				req.setAttribute("username", username);
				req.getRequestDispatcher("/success.jsp").forward(req, resp);
			}else {
				//  驗證失敗
				req.getRequestDispatcher("fail.jsp").forward(req, resp);
			}
		}else {
			//  驗證失敗
			req.getRequestDispatcher("fail.jsp").forward(req, resp);
		}
		//  移除session中的驗證碼
		req.removeAttribute("code");
	}
}

到這裡就寫完了,看以下截圖。(注:郵箱找不見,就去垃圾箱找,我今天測試了好多次,所以被qq郵箱當做垃圾郵件了

效果圖:

失敗測試:

顯示:

顯示:

            顯示的使用者名稱就是剛註冊的使用者名稱。

網易郵箱測試:

--------------------------------------------------------------------------------------------------------------------------------------------

補充:

以上傳送郵件的郵箱均為qq郵箱,收件人是任意郵箱型別(上面測試qq郵箱和網易郵箱)。現在我把發件人換成網易郵箱,會報如下554、535錯誤:
 

是什麼問題導致的呢? 測試一下,修改如下程式碼:

 

原因分析:就是說被當做垃圾或者病毒處理了,你肯定想問我就發幾個字而已,但事實就是被當做垃圾或者病毒郵件了,看報錯資訊可知。

網易郵箱截圖(更多錯誤:http://help.163.com/09/1224/17/5RAJ4LMH00753VB8.html):

535錯誤:

錯誤原因:授權碼或者郵箱錯誤導致的。可以參考這個部落格:https://blog.csdn.net/weixin_38465623/article/details/80789793

-------------------------------------------------------------------------------------------------

補充:535錯誤:用qq或者網易郵箱過多的傳送郵件也會導致這個錯誤。

---------------------------------------------------------------------------------------------------

說到這裡還是用qq測試,對初學者友好點,有時候程式碼沒問題,因為其他問題(比如554錯誤),但是初學者不知道問題所在,程式碼bug找半天,也不知道錯在哪裡,反而學起來沒信心。你可以先用我的程式碼先執行起來,成功之後,再增加其他一些操作(插入資料庫等等)。

到這裡測試全部完成,java郵箱啟用驗證成功。以上程式碼本人親測好幾次,均沒問題,所以你如果有問題的話,看看環境。

趕緊去測試一下,成功的話,留言說一聲。

原始碼地址:https://download.csdn.net/download/blackplus28/10865461

有積分想下載就下載,不想下載評論區留言或私信,我發你郵箱。

轉載請宣告出處:https://blog.csdn.net/BlackPlus28/article/details/85114001