現(xiàn)在很多的網(wǎng)站都提供有用戶注冊(cè)功能, 通常我們注冊(cè)成功之后就會(huì)收到一封來(lái)自注冊(cè)網(wǎng)站的郵件。郵件里面的內(nèi)容可能包含了我們的注冊(cè)的用戶名和密碼以及一個(gè)激活賬戶的超鏈接等信息。今天我們也來(lái)實(shí)現(xiàn)一個(gè)這樣的功能,用戶注冊(cè)成功之后,就將用戶的注冊(cè)信息以Email的形式發(fā)送到用戶的注冊(cè)郵箱當(dāng)中,實(shí)現(xiàn)發(fā)送郵件功能就得借助于JavaMail了。
一、搭建開(kāi)發(fā)環(huán)境
1.1、創(chuàng)建Web項(xiàng)目
1.2、用戶注冊(cè)的Jsp頁(yè)面
register.jsp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
<%@ page language="java" pageEncoding="UTF-8"%> <!DOCTYPE HTML> < html > < head > < title >注冊(cè)頁(yè)面</ title > </ head > < body > < form action = "${pageContext.request.contextPath}/servlet/RegisterServlet" method = "post" > 用戶名:< input type = "text" name = "username" >< br /> 密碼:< input type = "password" name = "password" >< br /> 郵箱:< input type = "text" name = "email" >< br /> < input type = "submit" value = "注冊(cè)" > </ form > </ body > </ html > |
1.3、消息提示頁(yè)面
message.jsp
1
2
3
4
5
6
7
8
9
10
11
|
<%@ page language="java" pageEncoding="UTF-8"%> <!DOCTYPE HTML> < html > < head > < title >消息提示頁(yè)面</ title > </ head > < body > ${message} </ body > </ html > |
二、編寫(xiě)處理用戶注冊(cè)處理程序
2.1、開(kāi)發(fā)封裝用戶注冊(cè)信息的domain
User.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
package me.gacl.domain; public class User { private String username; private String password; private String email; public String getUsername() { return username; } public void setUsername(String username) { this .username = username; } public String getPassword() { return password; } public void setPassword(String password) { this .password = password; } public String getEmail() { return email; } public void setEmail(String email) { this .email = email; } } |
2.2、編寫(xiě)郵件發(fā)送功能
發(fā)送郵件是一件非常耗時(shí)的事情,因此這里設(shè)計(jì)一個(gè)線程類來(lái)發(fā)送郵件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
|
package me.gacl.web.controller; import java.util.Properties; import javax.mail.Message; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import me.gacl.domain.User; /** * @ClassName: Sendmail * @Description: Sendmail類繼承Thread,因此Sendmail就是一個(gè)線程類,這個(gè)線程類用于給指定的用戶發(fā)送Email * @author: 孤傲蒼狼 * @date: 2015-1-12 下午10:43:48 * */ public class Sendmail extends Thread { //用于給用戶發(fā)送郵件的郵箱 private String from = "gacl@sohu.com" ; //郵箱的用戶名 private String username = "gacl" ; //郵箱的密碼 private String password = "郵箱密碼" ; //發(fā)送郵件的服務(wù)器地址 private String host = "smtp.sohu.com" ; private User user; public Sendmail(User user){ this .user = user; } /* 重寫(xiě)run方法的實(shí)現(xiàn),在run方法中發(fā)送郵件給指定的用戶 * @see java.lang.Thread#run() */ @Override public void run() { try{ Properties prop = new Properties(); prop.setProperty("mail.host", host); prop.setProperty("mail.transport.protocol", "smtp"); prop.setProperty("mail.smtp.auth", "true"); Session session = Session.getInstance(prop); session.setDebug(true); Transport ts = session.getTransport(); ts.connect(host, username, password); Message message = createEmail(session,user); ts.sendMessage(message, message.getAllRecipients()); ts.close(); }catch (Exception e) { throw new RuntimeException(e); } } /** * @Method: createEmail * @Description: 創(chuàng)建要發(fā)送的郵件 * @Anthor:孤傲蒼狼 * * @param session * @param user * @return * @throws Exception */ public Message createEmail(Session session,User user) throws Exception{ MimeMessage message = new MimeMessage(session); message.setFrom( new InternetAddress(from)); message.setRecipient(Message.RecipientType.TO, new InternetAddress(user.getEmail())); message.setSubject( "用戶注冊(cè)郵件" ); String info = "恭喜您注冊(cè)成功,您的用戶名:" + user.getUsername() + ",您的密碼:" + user.getPassword() + ",請(qǐng)妥善保管,如有問(wèn)題請(qǐng)聯(lián)系網(wǎng)站客服!!" ; message.setContent(info, "text/html;charset=UTF-8" ); message.saveChanges(); return message; } } |
2.3、編寫(xiě)處理用戶注冊(cè)的Servlet
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
package me.gacl.web.controller; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import me.gacl.domain.User; import me.gacl.service.UserService; public class RegisterServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { String username = request.getParameter( "username" ); String password = request.getParameter( "password" ); String email = request.getParameter( "email" ); User user = new User(); user.setEmail(email); user.setPassword(password); user.setUsername(username); System.out.println( "把用戶信息注冊(cè)到數(shù)據(jù)庫(kù)中" ); //用戶注冊(cè)成功之后就使用用戶注冊(cè)時(shí)的郵箱給用戶發(fā)送一封Email //發(fā)送郵件是一件非常耗時(shí)的事情,因此這里開(kāi)辟了另一個(gè)線程來(lái)專門(mén)發(fā)送郵件 Sendmail send = new Sendmail(user); //啟動(dòng)線程,線程啟動(dòng)之后就會(huì)執(zhí)行run方法來(lái)發(fā)送郵件 send.start(); //注冊(cè)用戶 //new UserService().registerUser(user); request.setAttribute( "message" , "恭喜您,注冊(cè)成功,我們已經(jīng)發(fā)了一封帶了注冊(cè)信息的電子郵件,請(qǐng)查收,如果沒(méi)有收到,可能是網(wǎng)絡(luò)原因,過(guò)一會(huì)兒就收到了!!" ); request.getRequestDispatcher( "/message.jsp" ).forward(request, response); } catch (Exception e) { e.printStackTrace(); request.setAttribute( "message" , "注冊(cè)失敗!!" ); request.getRequestDispatcher( "/message.jsp" ).forward(request, response); } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } } |
程序運(yùn)行效果如下:
現(xiàn)在很多網(wǎng)站都有這樣的功能,用戶注冊(cè)完成之后,網(wǎng)站根據(jù)我們注冊(cè)時(shí)填寫(xiě)的郵箱給我們一封Email,然后點(diǎn)擊Email中的超鏈接去激活我們的用戶。這種功能就是這樣實(shí)現(xiàn)的。
在總結(jié)使用JavaMail發(fā)送郵件時(shí)發(fā)現(xiàn),將郵件發(fā)送到sina或者sohu的郵箱時(shí),不一定能夠馬上收取得到郵件,總是有延遲,有時(shí)甚至?xí)舆t很長(zhǎng)的時(shí)間,甚至?xí)划?dāng)成垃圾郵件來(lái)處理掉,或者干脆就拒絕接收,有時(shí)候?yàn)榱丝吹洁]件發(fā)送成功的效果,要等半天,實(shí)屬無(wú)奈啊。