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>密 碼:</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