狂神說Java【網站註冊傳送郵件功能實現】—— (四) 網站註冊傳送郵件功能實現
阿新 • • 發佈:2020-09-09
分析:在我們註冊的時候,前端我們填寫的就是一個表單,這個表單提交給後端的servlet,這個servlet就向我們填寫的那個郵箱中傳送一封郵件
所以我們需要建立一個javaweb專案,因為要使用到前端頁面+servlet
拷貝兩個前端素材
註冊頁面
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%--註冊填寫郵箱的前端頁面--%> <html> <head> <title>註冊</title> </head> <body> <form action="${pageContext.request.contextPath}/RegisterServlet.do" method="post"> 使用者名稱:<input type="text" name="username"><br/> 密碼:<input type="password" name="password"><br/> 郵箱:<input type="text" name="email"><br/> <input type="submit" value="註冊"> </form> </body> </html>
提示成功頁面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>提示資訊</title>
</head>
<body>
<h2>thhh提醒您</h2>
${message}
</body>
</html>
編寫servlet
package com.thhh.servlet; import com.thhh.pojo.User; import com.thhh.utils.Sendmail; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class RegisterServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //1、接收使用者填寫的表單資料 String username = req.getParameter("username"); String password = req.getParameter("password"); String email = req.getParameter("email"); // System.out.println(username+password+email); //2、向用戶郵箱傳送郵件,注意傳送郵件很耗時,所以我們啟動一個子執行緒去做這件事,而使用者則是直接跳轉註冊成功頁面,以免降低使用者體驗 User user = new User(username,password,email); Sendmail sendmail = new Sendmail(user);//獲取子執行緒物件 new Thread(sendmail).start();//啟動子執行緒 //3、檢視跳轉 req.setAttribute("message","註冊成功!我們已經向您的郵箱傳送了郵件,請您及時進行查收。由於網路原因,您收到郵件的時間存在延遲,敬請諒解~"); req.getRequestDispatcher("info.jsp").forward(req,resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
多執行緒工具類
package com.thhh.utils; //多執行緒實現郵件傳送 //使用多執行緒的原因就是提高使用者的體驗,一旦一個頁面3s及以上的時間白屏就可能被使用者關掉 //所以我們在使用者提交表單之後,將費時的郵件傳送工作使用一個子執行緒來完成,而主執行緒還是去完成它自己的事情 //這麼做就可以提高使用者體驗,不然使用者等待郵件傳送的時間 import com.sun.mail.util.MailSSLSocketFactory; import com.thhh.pojo.User; import javax.mail.*; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import java.security.GeneralSecurityException; import java.util.Properties; //多執行緒這種處理就可以稱為非同步處理 public class Sendmail implements Runnable{ private String from = "[email protected]";//我們用來向客戶傳送郵件的郵箱 private String username = "[email protected]";//用於登陸SMTP伺服器的使用者名稱 private String password = "授權碼";//授權碼 private User user; public Sendmail(User user) { this.user = user;//用於獲取使用者郵箱地址 } @Override public void run() { try { Properties prop = new Properties(); prop.setProperty("mail.host", "smtp.qq.com"); //設定QQ郵件伺服器 prop.setProperty("mail.transport.protocol", "smtp"); // 郵件傳送協議 prop.setProperty("mail.smtp.auth", "true"); // 需要驗證使用者名稱密碼 // 關於QQ郵箱,還要設定SSL加密,加上以下程式碼即可 MailSSLSocketFactory sf = new MailSSLSocketFactory(); sf.setTrustAllHosts(true); prop.put("mail.smtp.ssl.enable", "true"); prop.put("mail.smtp.ssl.socketFactory", sf); //使用JavaMail傳送郵件的5個步驟 //1、建立定義整個應用程式所需的環境資訊的 Session 物件 //使用QQ郵箱的時候才需要,其他郵箱不需要這一段程式碼 Session session = Session.getDefaultInstance(prop, new Authenticator() {//獲取和SMTP伺服器的連線物件 public PasswordAuthentication getPasswordAuthentication() { //發件人郵件使用者名稱、授權碼 return new PasswordAuthentication(username, password); } }); //開啟Session的debug模式,這樣就可以檢視到程式傳送Email的執行狀態 session.setDebug(true); //2、通過session得到transport物件 Transport ts = session.getTransport();//通過這一次和SMTP伺服器的連線物件獲取傳送郵件的傳輸物件 //3、使用郵箱的使用者名稱和授權碼連上SMTP郵件伺服器,即登陸 ts.connect("smtp.qq.com", username, password); //4、建立郵件物件MimeMessage——點選網頁上的寫信 //建立一個郵件物件 MimeMessage message = new MimeMessage(session); //指明郵件的發件人——在網頁上填寫發件人 message.setFrom(new InternetAddress(username));//設定發件人 //指明郵件的收件人,現在發件人和收件人是一樣的,那就是自己給自己發——在網頁上填寫收件人 message.setRecipient(Message.RecipientType.TO, new InternetAddress(user.getEmail()));//設定收件人 //郵件的標題——在網頁上填寫郵件標題 message.setSubject("歡迎註冊thhh!");//設定郵件主題 //郵件的文字內容——在網頁上填寫郵件內容 message.setContent("<p><h2>恭喜註冊成功!</h2></p>您的使用者名稱為:<h4>"+user.getUsername()+"</h4>請妥善保管您的密碼,如有問題請及時聯絡網站客服,再次歡迎您的加入!!", "text/html;charset=UTF-8");//設定郵件的具體內容 //5、傳送郵件——在網頁上點擊發送按鈕 ts.sendMessage(message, message.getAllRecipients()); //6、關閉連線物件,即關閉伺服器上的連線資源 ts.close(); } catch (MessagingException e) { e.printStackTrace(); } catch (GeneralSecurityException e) { e.printStackTrace(); } } }
測試
測試成功!