JavaWeb學習總結(五十三)——Web應用中使用JavaMail發送郵件


  現在很多的網站都提供有用戶注冊功能, 通常我們注冊成功之后就會收到一封來自注冊網站的郵件。郵件里面的內容可能包含了我們的注冊的用戶名和密碼以及一個激活賬戶的超鏈接等信息。今天我們也來實現一個這樣的功能,用戶注冊成功之后,就將用戶的注冊信息以Email的形式發送到用戶的注冊郵箱當中,實現發送郵件功能就得借助於JavaMail了。

一、搭建開發環境

1.1、創建Web項目

  

1.2、用戶注冊的Jsp頁面

register.jsp

 1 <%@ page language="java" pageEncoding="UTF-8"%>
 2 <!DOCTYPE HTML>
 3 <html>
 4   <head>
 5     <title>注冊頁面</title>
 6   </head>
 7   
 8   <body>
 9     <form action="${pageContext.request.contextPath}/servlet/RegisterServlet" method="post">
10         用戶名:<input type="text" name="username"><br/>
11         密碼:<input type="password" name="password"><br/>
12         郵箱:<input type="text" name="email"><br/>
13         <input type="submit" value="注冊">
14     </form>
15   </body>
16 </html>

1.3、消息提示頁面

message.jsp

 1 <%@ page language="java" pageEncoding="UTF-8"%>
 2 <!DOCTYPE HTML>
 3 <html>
 4   <head>
 5     <title>消息提示頁面</title>
 6   </head>
 7   
 8   <body>
 9        ${message}
10   </body>
11 </html>

二、編寫處理用戶注冊處理程序

2.1、開發封裝用戶注冊信息的domain

User.java

 1 package me.gacl.domain;
 2 
 3 public class User {
 4     private String username;
 5     private String password;
 6     private String email;
 7     public String getUsername() {
 8         return username;
 9     }
10     public void setUsername(String username) {
11         this.username = username;
12     }
13     public String getPassword() {
14         return password;
15     }
16     public void setPassword(String password) {
17         this.password = password;
18     }
19     public String getEmail() {
20         return email;
21     }
22     public void setEmail(String email) {
23         this.email = email;
24     }
25 }

2.2、編寫郵件發送功能

  發送郵件是一件非常耗時的事情,因此這里設計一個線程類來發送郵件

 1 package me.gacl.web.controller;
 2 
 3 import java.util.Properties;
 4 import javax.mail.Message;
 5 import javax.mail.Session;
 6 import javax.mail.Transport;
 7 import javax.mail.internet.InternetAddress;
 8 import javax.mail.internet.MimeMessage;
 9 import me.gacl.domain.User;
10 
11 /**
12 * @ClassName: Sendmail
13 * @Description: Sendmail類繼承Thread,因此Sendmail就是一個線程類,這個線程類用於給指定的用戶發送Email
14 * @author: 孤傲蒼狼
15 * @date: 2015-1-12 下午10:43:48
16 *
17 */ 
18 public class Sendmail extends Thread {
19         //用於給用戶發送郵件的郵箱
20     private String from = "gacl@sohu.com";
21         //郵箱的用戶名
22     private String username = "gacl";
23         //郵箱的密碼
24     private String password = "郵箱密碼";
25         //發送郵件的服務器地址
26     private String host = "smtp.sohu.com";
27     
28     private User user;
29     public Sendmail(User user){
30         this.user = user;
31     }
32     
33     /* 重寫run方法的實現,在run方法中發送郵件給指定的用戶
34      * @see java.lang.Thread#run()
35      */
36     @Override
37     public void run() {
38         try{
39             Properties prop = new Properties();
40             prop.setProperty("mail.host", host);
41             prop.setProperty("mail.transport.protocol", "smtp");
42             prop.setProperty("mail.smtp.auth", "true");
43             Session session = Session.getInstance(prop);
44             session.setDebug(true);
45             Transport ts = session.getTransport();
46             ts.connect(host, username, password);
47             Message message = createEmail(session,user);
48             ts.sendMessage(message, message.getAllRecipients());
49             ts.close();
50         }catch (Exception e) {
51             throw new RuntimeException(e);
52         }
53     }
54     
55     /**
56     * @Method: createEmail
57     * @Description: 創建要發送的郵件
58     * @Anthor:孤傲蒼狼
59     *
60     * @param session
61     * @param user
62     * @return
63     * @throws Exception
64     */ 
65     public Message createEmail(Session session,User user) throws Exception{
66         
67         MimeMessage message = new MimeMessage(session);
68         message.setFrom(new InternetAddress(from));
69         message.setRecipient(Message.RecipientType.TO, new InternetAddress(user.getEmail()));
70         message.setSubject("用戶注冊郵件");
71         
72         String info = "恭喜您注冊成功,您的用戶名:" + user.getUsername() + ",您的密碼:" + user.getPassword() + ",請妥善保管,如有問題請聯系網站客服!!";
73         message.setContent(info, "text/html;charset=UTF-8");
74         message.saveChanges();
75         return message;
76     }
77 }

2.3、編寫處理用戶注冊的Servlet

 1 package me.gacl.web.controller;
 2 
 3 import java.io.IOException;
 4 import javax.servlet.ServletException;
 5 import javax.servlet.http.HttpServlet;
 6 import javax.servlet.http.HttpServletRequest;
 7 import javax.servlet.http.HttpServletResponse;
 8 import me.gacl.domain.User;
 9 import me.gacl.service.UserService;
10 
11 public class RegisterServlet extends HttpServlet {
12 
13     public void doGet(HttpServletRequest request, HttpServletResponse response)
14             throws ServletException, IOException {
15         try{
16             String username = request.getParameter("username");
17             String password = request.getParameter("password");
18             String email = request.getParameter("email");
19             User user = new User();
20             user.setEmail(email);
21             user.setPassword(password);
22             user.setUsername(username);
23             
24             System.out.println("把用戶信息注冊到數據庫中");
25             //用戶注冊成功之后就使用用戶注冊時的郵箱給用戶發送一封Email
26             //發送郵件是一件非常耗時的事情,因此這里開辟了另一個線程來專門發送郵件
27             Sendmail send = new Sendmail(user);
28             //啟動線程,線程啟動之后就會執行run方法來發送郵件
29             send.start();
30             
31             //注冊用戶
32             //new UserService().registerUser(user);
33             request.setAttribute("message", "恭喜您,注冊成功,我們已經發了一封帶了注冊信息的電子郵件,請查收,如果沒有收到,可能是網絡原因,過一會兒就收到了!!");
34             request.getRequestDispatcher("/message.jsp").forward(request, response);
35         }catch (Exception e) {
36             e.printStackTrace();
37             request.setAttribute("message", "注冊失敗!!");
38             request.getRequestDispatcher("/message.jsp").forward(request, response);
39         }
40     }
41 
42     public void doPost(HttpServletRequest request, HttpServletResponse response)
43             throws ServletException, IOException {
44         doGet(request, response);
45     }
46 }

  程序運行效果如下:

  

  現在很多網站都有這樣的功能,用戶注冊完成之后,網站根據我們注冊時填寫的郵箱給我們一封Email,然后點擊Email中的超鏈接去激活我們的用戶。這種功能就是這樣實現的。

  在總結使用JavaMail發送郵件時發現,將郵件發送到sina或者sohu的郵箱時,不一定能夠馬上收取得到郵件,總是有延遲,有時甚至會延遲很長的時間,甚至會被當成垃圾郵件來處理掉,或者干脆就拒絕接收,有時候為了看到郵件發送成功的效果,要等半天,實屬無奈啊。


免責聲明!

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



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