狂神說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 = "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();
        }
    }
}

測試


測試成功!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM