1. 程式人生 > 實用技巧 >狂神說Java【網站註冊傳送郵件功能實現】—— (四) 網站註冊傳送郵件功能實現

狂神說Java【網站註冊傳送郵件功能實現】—— (四) 網站註冊傳送郵件功能實現

分析:在我們註冊的時候,前端我們填寫的就是一個表單,這個表單提交給後端的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();
        }
    }
}

測試


測試成功!