分析:在我們注冊的時候,前端我們填寫的就是一個表單,這個表單提交給后端的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 = "XXXX@qq.com";//我們用來向客戶發送郵件的郵箱
private String username = "XXXX@qq.com";//用於登陸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();
}
}
}
測試
測試成功!