關於JavaMail實現QQ郵箱發送郵件的實現(二)


前言:

  這篇文章所涉及的關鍵部分是在關於JavaMail實現QQ郵箱發送郵件的實現(一)的基礎上完成的,所以請先閱讀上一篇文章,以便更好的理解這一篇。這篇文章中實現的功能是,在用戶注冊的時候,通過系統郵箱向注冊的郵箱發送一封激活郵件,在點擊激活之后,完成用戶的注冊。

   需要的相關JAR包和配置文件下載:https://i.cnblogs.com/Files.aspx

一 引入相關JAR包

1.在新建的Java Web工程中的WebRoot-->WEB-INF-->lib下導入以下這個四個JAR包

 

2. 在Java Web工程中的src目錄下導入c3p0配置文件

 

二  搭建好包結構和類結構

 

 三 數據庫相關

1.創建MYSQL數據庫

 1 /**
 2 * state 是激活狀態,0:未激活 1:已經激活
 3 * code 是激活碼
 4 */
 5 
 6 create database mail;
 7 use mail;
 8 create table user (
 9     id int primary key auto_increment,
10     username varchar(20) default null,
11     password varchar(20) default null, 
12     email varchar(30) default null,
13     state int(11) default null,
14     code varchar(64) default null
15 );

 

2.創建數據庫類JDBCUtils.java (數據池連接)

 1 package com.mail.utils;
 2 
 3 import com.mchange.v2.c3p0.ComboPooledDataSource;
 4 
 5 public class JDBCUtils {
 6     private static String url = "jdbc:mysql://localhost:3306/mail";  //注意用自己的創建的數據庫
 7     private static String user = "root";
 8     private static String passwd = "數據庫登錄密碼";
 9     private static String driver = "com.mysql.jdbc.Driver";
10    
11     public static ComboPooledDataSource getDataSource() throws Exception{
12         ComboPooledDataSource cpds = new ComboPooledDataSource(); 
13         cpds.setDriverClass( driver);
14         cpds.setJdbcUrl( url );
15         cpds.setUser(user);                                  
16         cpds.setPassword(passwd);  
17         cpds.setMinPoolSize(5);                                     
18         cpds.setAcquireIncrement(5);
19         cpds.setMaxPoolSize(30);
20         cpds.setMaxIdleTime(60);
21         return cpds;
22     }
23 }

 

 四 核心代碼

1.創建一個表單的注冊頁面register.jsp,該表單會提交到RegisterServlet上

 1 <!-- 用戶注冊的頁面 -->
 2 
 3 <%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>
 4 
 5 <%
 6 String path = request.getContextPath();
 7 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
 8 %>
 9 
10 
11 
12 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
13 <html>
14   <head>
15     <base href="<%=basePath%>">
16     
17     <title>My JSP 'register.jsp' starting page</title>
18     
19     <meta http-equiv="pragma" content="no-cache">
20     <meta http-equiv="cache-control" content="no-cache">
21     <meta http-equiv="expires" content="0">    
22     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
23     <meta http-equiv="description" content="This is my page">
24     <!--
25     <link rel="stylesheet" type="text/css" href="styles.css">
26     -->
27 
28   </head>
29   
30   <body>
31     <h1>用戶注冊界面</h1>
32     <form action="RegisterServlet" method="post">
33         <table border="1">
34             <tr>
35                 <td>用戶名:</td>
36                 <td><input type="text" name="username" size="30"></td>
37             </tr>
38             <tr>
39                 <td>密碼:</td>
40                 <td><input type="password" name="password" size="30"></td>
41             </tr>
42             <tr>
43                 <td>驗證郵箱:</td>
44                 <td><input type="text" name="email" size="30"></td>
45             </tr>
46             <tr>
47                 <td colspan="2" align="center"><input type="submit" value="提交"></td>
48             </tr>
49         </table>
50     </form>
51   </body>
52 </html>

 

2.創建User對象類User.java

 1 package com.mail.bean;
 2 
 3 /**
 4  * 
 5  * user的javabean實體類
 6  *
 7  */
 8 public class User {
 9     private Integer id;
10     private String username;
11     private String password;
12     private String email;
13     private Integer state;   
14     private String code;
15 
16     public Integer getId() {
17         return id;
18     }
19     public void setId(Integer id) {
20         this.id = id;
21     }
22     public String getUsername() {
23         return username;
24     }
25     public void setUsername(String username) {
26         this.username = username;
27     }
28     public String getPassword() {
29         return password;
30     }
31     public void setPassword(String password) {
32         this.password = password;
33     }
34     public String getEmail() {
35         return email;
36     }
37     public void setEmail(String email) {
38         this.email = email;
39     }
40     public Integer getState() {
41         return state;
42     }
43     public void setState(Integer state) {
44         this.state = state;
45     }
46     public String getCode() {
47         return code;
48     }
49     public void setCode(String code) {
50         this.code = code;
51     }
52 }

 

3. register.jsp提交過來的數據由RegisterServlet.java處理,而RegisterServlet.java只能調用業務層UserService.java接口

 1 package com.mail.servlet;
 2 
 3 import java.io.IOException;
 4 
 5 import javax.servlet.ServletException;
 6 import javax.servlet.http.HttpServlet;
 7 import javax.servlet.http.HttpServletRequest;
 8 import javax.servlet.http.HttpServletResponse;
 9 
10 import com.mail.bean.User;
11 import com.mail.service.UserService;
12 import com.mail.service.UserServiceImpl;
13 import com.mail.utils.UUIDUtils;
14 
15 public class RegisterServlet extends HttpServlet {
16 
17     private static final long serialVersionUID = 1L;
18 
19     public void doGet(HttpServletRequest request, HttpServletResponse response)
20             throws ServletException, IOException {
21         
22         //接收表格傳進來的數據
23         request.setCharacterEncoding("GB18030");   //設置編碼
24         String username = request.getParameter("username");
25         String password = request.getParameter("password");
26         String email = request.getParameter("email");
27         
28         //數據封裝
29         User user = new User();
30         user.setUsername(username);
31         user.setPassword(password);
32         user.setEmail(email);
33         user.setState(0);   //0:未激活     1:已激活
34         String code = UUIDUtils.getUUID();  //得到的編碼去掉所有"-",剩32位
35         user.setCode(code);
36         
37         //調用業務層傳遞用戶信息
38         UserService userService = new UserServiceImpl();
39         userService.register(user);
40         
41         //頁面跳轉
42         request.setAttribute("msg", "您已注冊成功,請去郵箱激活!");
43         request.getRequestDispatcher("/msg.jsp").forward(request, response);
44     }
45 
46     public void doPost(HttpServletRequest request, HttpServletResponse response)
47             throws ServletException, IOException {
48         doGet(request, response);   //記得一定要調用這個
49     }
50 
51 }

 

4. UserService.java接口代碼

 1 package com.mail.service;
 2 
 3 import com.mail.bean.User;
 4 
 5 public interface UserService {
 6 
 7     void register(User user);
 8 
 9     User foundByCode(String code);
10 
11     void update(User user);
12 
13 }

 

5.UserServiceImpl.java實現了UserService.java接口

 1 package com.mail.service;
 2 
 3 import javax.mail.MessagingException;
 4 import javax.mail.internet.AddressException;
 5 
 6 import com.mail.bean.User;
 7 import com.mail.dao.UserDAO;
 8 import com.mail.dao.UserDaoImpl;
 9 import com.mail.utils.MailUtils;
10 
11 public class UserServiceImpl implements UserService {
12 
13     @Override
14     public void register(User user) {
15         //向dao傳遞user
16         UserDAO userDAO = new UserDaoImpl();
17         userDAO.register(user);
18         
19         //給郵箱發送一封郵件
20         try {
21             MailUtils.senMail(user.getEmail(), user.getCode());  
22         } catch (AddressException e) {
23             e.printStackTrace();
24         } catch (MessagingException e) {
25             e.printStackTrace();
26         }
27     }
28 
29     @Override
30     public User foundByCode(String code) {
31         UserDAO userDAO = new UserDaoImpl();
32         return userDAO.foundByCode(code);
33     }
34 
35     @Override
36     public void update(User user) {
37         UserDAO userDAO = new UserDaoImpl();
38         userDAO.update(user);
39     }
40 }

 

6.UserServiceImpl.java調用數據層接口的接口類UserDAO.java

 1 package com.mail.dao;
 2 
 3 import com.mail.bean.User;
 4 
 5 public interface UserDAO {
 6 
 7     void register(User user);
 8 
 9     User foundByCode(String code);
10 
11     void update(User user);
12 
13 }

 

7.同樣的UserDaoImpl.java為UserDAO.java的實現類,直接調用了數據庫連接池

 1 package com.mail.dao;
 2 
 3 import java.sql.SQLException;
 4 
 5 import org.apache.commons.dbutils.QueryRunner;
 6 import org.apache.commons.dbutils.handlers.BeanHandler;
 7 
 8 import com.mail.bean.User;
 9 import com.mail.utils.JDBCUtils;
10 
11 public class UserDaoImpl implements UserDAO {
12 
13     @Override
14     public void register(User user) {
15         QueryRunner queryRunner = null;
16         try {
17             queryRunner = new QueryRunner(JDBCUtils.getDataSource());  //連接數據池
18             String sql = "insert into user values (?, ?, ?, ?, ?, ?)"; //插入數據
19             Object[] params = {user.getId(), user.getUsername(), user.getPassword(), user.getEmail(), user.getState(), user.getCode()};
20             queryRunner.update(sql, params);
21             } catch (SQLException e) {
22                 e.printStackTrace();
23             }  catch (Exception e) {
24                 e.printStackTrace();
25             }
26     }
27 
28     @Override
29     public User foundByCode(String code) {
30         QueryRunner queryRunner = null;
31         User user = null;
32         try {
33             queryRunner = new QueryRunner(JDBCUtils.getDataSource());
34             String sql = "select * from user where code = ?";
35             //BeanHandler<T>用於獲取結果集中的第一行數據,並將其封裝到JavaBean對象
36             user = queryRunner.query(sql, new BeanHandler<User>(User.class), code);
37         } catch (Exception e) {
38             e.printStackTrace();
39         }
40         return user;
41     }
42 
43     @Override
44     public void update(User user) {
45         QueryRunner queryRunner = null;
46         try {
47             queryRunner = new QueryRunner(JDBCUtils.getDataSource());
48             String sql = "update user set username=?, password=?, email=?, state=?, code=? where id=?";
49             Object[] params = {user.getUsername(), user.getPassword(), user.getEmail(), user.getState(), user.getCode(),user.getId()};
50             queryRunner.update(sql, params);52         } catch (Exception e) {
53             e.printStackTrace();
54         }
55     }
56 }

 

8.接着就是發送一封激活郵件給郵箱MailUtils.java

 1 package com.mail.utils;
 2 
 3 import java.util.Properties;
 4 
 5 import javax.mail.Message;
 6 import javax.mail.MessagingException;
 7 import javax.mail.Session;
 8 import javax.mail.Transport;
 9 import javax.mail.internet.AddressException;
10 import javax.mail.internet.InternetAddress;
11 import javax.mail.internet.MimeMessage;
12 import javax.mail.internet.MimeMessage.RecipientType;
13 
14 public class MailUtils {
15     public static void senMail(String toMail, String code) throws AddressException, MessagingException {
16         
17         Properties properties = new Properties();
18         properties.put("mail.transport.protocol", "smtp"); // 連接協議
19         properties.put("mail.smtp.host", "smtp.qq.com"); // 主機名
20         properties.put("mail.smtp.port", 465);  // 端口號
21         properties.put("mail.smtp.auth", "true");
22         properties.put("mail.smtp.ssl.enable", "true");  // 設置是否使用ssl安全連接 (一般都使用)
23         properties.put("mail.debug", "true"); // 設置是否顯示debug信息 true 會在控制台顯示相關信息
24         // 得到回話對象
25         Session session = Session.getInstance(properties);
26         // 獲取郵件對象
27         Message message = new MimeMessage(session);
28         // 設置發件人郵箱地址
29         message.setFrom(new InternetAddress("系統郵箱@qq.com"));
30         // 設置收件人地址 
31         message.setRecipients( RecipientType.TO, new InternetAddress[] { new InternetAddress(toMail) });
32         // 設置郵件標題
33         message.setSubject("由JavaMail發出的測試郵件");
34         // 設置郵件內容
35         message.setContent("<h1>請點擊以下鏈接址激活注冊:</br><h3>(若無法點擊,請復制到瀏覽器中打開)</h3></h1><h3><a herf='http://localhost:8080/MailTest/ActiveServlet?code="+code+"'>http://localhost:8080/MailTest/ActiveServlet?code="+code+"</a></h3>","text/html;Charset=UTF-8");
36         // 得到郵差對象
37         Transport transport = session.getTransport();
38         // 連接自己的郵箱賬戶
39         transport.connect("系統郵箱@qq.com", "cnqhvvkhqnzzbgce"); //密碼為剛才得到的授權碼
40         // 發送郵件 
41         transport.sendMessage(message, message.getAllRecipients());
42     }
43 }

 

9.響應激活郵箱的servlet類ActiveServlet.java

 1 package com.mail.servlet;
 2 
 3 import java.io.IOException;
 4 
 5 import javax.servlet.ServletException;
 6 import javax.servlet.http.HttpServlet;
 7 import javax.servlet.http.HttpServletRequest;
 8 import javax.servlet.http.HttpServletResponse;
 9 
10 import com.mail.bean.User;
11 import com.mail.service.UserService;
12 import com.mail.service.UserServiceImpl;
13 
14 public class ActiveServlet extends HttpServlet {
15 
16     private static final long serialVersionUID = 1L;
17 
18     public void doGet(HttpServletRequest request, HttpServletResponse response)
19             throws ServletException, IOException {
20         //接受郵箱鏈接的激活碼
21         String code = request.getParameter("code");
22         
23         //根據激活碼查找到用戶
24         UserService userService = new UserServiceImpl();
25         User user = userService.foundByCode(code);
26         if (user != null) {
27             user.setState(1);
28             user.setCode(null);
29             userService.update(user);
30             request.setAttribute("msg", "您已激活成功,請去登陸!");
31         }else {
32             //沒有查到該用戶
33             request.setAttribute("msg", "您的激活碼有誤,請點擊鏈接重新激活!");
34         }
35         
36         //跳轉至指定頁面
37         request.getRequestDispatcher("/msg.jsp").forward(request, response);
38     }
39 
40     public void doPost(HttpServletRequest request, HttpServletResponse response)
41             throws ServletException, IOException {
42         doGet(request, response);
43     }
44 
45 }

 

10. msg.jsp代碼

 1 <%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>
 2 <%
 3 String path = request.getContextPath();
 4 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
 5 %>
 6 
 7 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 8 <html>
 9   <head>
10     <base href="<%=basePath%>">
11     
12     <title>My JSP 'msg.jsp' starting page</title>
13     
14     <meta http-equiv="pragma" content="no-cache">
15     <meta http-equiv="cache-control" content="no-cache">
16     <meta http-equiv="expires" content="0">    
17     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
18     <meta http-equiv="description" content="This is my page">
19     <!--
20     <link rel="stylesheet" type="text/css" href="styles.css">
21     -->
22 
23   </head>
24   
25   <body>
26     <h1> ${ msg } </h1>
27   </body>
28 </html>

 

11.生成激活碼的代碼

 1 package com.mail.utils;
 2 
 3 /**
 4  * 用UUID隨機產生字符串,用於激活碼code
 5  */
 6 
 7 import java.util.UUID;
 8 
 9 public class UUIDUtils {
10     public static String getUUID() {
11         return UUID.randomUUID().toString().replaceAll("-", "");
12     }
13 }

 

12.Servlet的.xml配置文件

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <web-app version="3.0"
 3     xmlns="http://java.sun.com/xml/ns/javaee"
 4     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 5     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
 6   <servlet>
 7     <description>My First Servlet</description>
 8     <display-name>HelloServle</display-name>
 9     <servlet-name>RegisterServlet</servlet-name>
10     <servlet-class>com.mail.servlet.RegisterServlet</servlet-class>
11   </servlet>
12   <servlet>
13     <description>My First Servlet</description>
14     <display-name>HelloServle</display-name>
15     <servlet-name>ActiveServlet</servlet-name>
16     <servlet-class>com.mail.servlet.ActiveServlet</servlet-class>
17   </servlet>
18 
19 
20   <servlet-mapping>
21     <servlet-name>RegisterServlet</servlet-name>
22     <url-pattern>/RegisterServlet</url-pattern>
23   </servlet-mapping>
24   <servlet-mapping>
25     <servlet-name>ActiveServlet</servlet-name>
26     <url-pattern>/ActiveServlet</url-pattern>
27   </servlet-mapping>
28 
29 </web-app>

 

五 完成

  以上為全部代碼內容,一定主要XML的文件配置以及JAR導入不要出錯,根據部分人JDK環境的不同,可能還需要activation.jar和mail.jar兩個包,在試用以上代碼的時候一定要注意每一層的調用關系,有些地方需要自己修改的要注意(比如數據庫的登陸密碼,自己設置的系統郵箱,已經授權碼等),要是看完之后發現有錯誤的地方或者又不理解的地方,請給我留言。最后祝大家開心度過每一天!o(* ̄▽ ̄*)ブ


免責聲明!

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



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