JavaMail模仿CSDN找回密碼的功能

1.    理解三個名詞

1.1.    什麼是SMTP:

SMTP(Simple Mail Transfer):簡單郵件傳輸協議。它定義了發送電子郵件的機制,是一組用於由源地址到目的地址傳送郵件的規則,由它來控制郵件的中轉方式。該協議屬於TCP/IP協議族,幫助每臺計算機在發送或中轉信件時找到下一個目的。SMTP服務器可將消息中轉至接收方SMTP服務器,以便最終讓用戶經由POP或IMAP獲得。

1.2.    什麼是POP:

POP3(Post Office Protocol): 郵局協議的第三版本。它是規定個人計算機如何連接到互聯網上的郵件服務器進行收發郵件的協議。POP3協議允許用戶從服務器上把郵件存儲到本地主機(即自己的計算機)上,同時根據客戶端的操作刪除或保存在郵件服務器上的郵件。POP3服務器就是遵循POP3協議的接收郵件服務器,用來接收電子郵件。

1.3.    什麼是IMAP:

IMAP(Internet Mail Access Protocol): 交互式郵件存取協議。它與POP3協議的主要區別是用戶可以不用把所有的郵件全部下載,可以通過客戶端直接對服務器上的郵件進行操作。常用的版本是IMAP4。

2.    JavaMail API

JavaMail API 是一個用於閱讀、編寫和發送電子郵件的可選包(標準擴展)。與 Eudora、pine 及 Microsoft Outlook 相似,這個包用來創建郵件用戶代理(Mail User Agent,MUA) 類型程序。API 的主要用途並不在於傳輸、發送和轉發消息;這一功能範圍屬於某些應用程序,如 sendmail 及其它郵件傳輸代理(Mail Transfer Agent,MTA)類型程序。MUA 類型的程序能讓用戶閱讀和書寫郵件,而它卻依賴 MTA 處理實際發送。

3.    JavaMail環境搭建

3.1.    JavaMail類庫:

從官方網站下載javamail-1_4.zip包,解開後就有了mail.jar包,把mail.jar加到應用的類路徑中。

3.2.    JAF類庫:

JavaMail API 的所有版本都需要 JavaBeans Activation Framework 來支持任意數據塊的輸入及相應處理。
到到官網進行下載,並將activation.jar添加到應用的類路徑中。

4.    JavaMail發送郵件三大步驟

4.1.    創建會話(javax.mail.Session)

Properties props = new Properties();
props.put("mail.smtp.host", smtpHost); //設置smtp主機名
props.put("mail.smtp.auth", "true"); //需要安全驗證
//創建網絡連接身份驗證類對象
MailAuthenticator mailauth = new MailAuthenticator(userName, password);
Session sendMailSession = Session.getDefaultInstance(props, mailauth);
session.setDebug(true);  //啓動調試

4.2.    編寫消息(javax.mail.Message)

// 創建message對象
Message msg = new MimeMessage(sendMailSession);
// 設置發件人
msg.setFrom(new InternetAddress(from));
// 設置主收件人
msg.setRecipient(Message.RecipientType.TO, new InternetAddress(to));
// 同時可設置多個抄送或暗送
//msg.setRecipients(Message.RecipientType.CC, new InternetAddress[]{…});
// 設置郵件標題
msg.setSubject(subject);
// 設置郵件內容(純文本格式)
msg.setText(content);  //msg.setContent(content, "text/plain")
// 設置郵件發送時間
msg.setSentDate(new java.util.Date());

4.3.    發送消息(javax.mail.Transport)

// 利用Transpost即可發送郵件
Transport.send(msg);

5.    使用JavaMail模仿CSDN找回密碼的功能

5.1.    寫個Mail類,包含郵件所需各參數及發件功能

Mail.java:
  1. /** 
  2.  *  ClassName: Mail.java 
  3.  *  Created on 2011 
  4.  *  Copyrights 2011 hi.csdn.net/tjcyjd All rights reserved. 
  5.  *  site: http://hi.csdn.net/tjcyjd 
  6.  *  email: [email protected] 
  7.  */  
  8. package com.tjcyjd.web.mail;  
  9.   
  10. import java.util.Date;  
  11. import java.util.Properties;  
  12.   
  13. import javax.mail.Authenticator;  
  14. import javax.mail.Message;  
  15. import javax.mail.Multipart;  
  16. import javax.mail.PasswordAuthentication;  
  17. import javax.mail.Session;  
  18. import javax.mail.Transport;  
  19. import javax.mail.internet.MimeBodyPart;  
  20. import javax.mail.internet.MimeMessage;  
  21. import javax.mail.internet.MimeMultipart;  
  22. import javax.mail.internet.MimeUtility;  
  23. import javax.mail.internet.InternetAddress;  
  24.   
  25. /** 
  26.  * Mail實體類(包含發件功能) 
  27.  *  
  28.  * @author yjd 
  29.  */  
  30. public class Mail {  
  31.     String to = ""// 收件人  
  32.     String from = ""// 發件人  
  33.     String host = ""// smtp主機  
  34.     String username = ""// 用戶名  
  35.     String password = ""// 密碼  
  36.     String subject = ""// 郵件主題  
  37.     String content = ""// 郵件正文  
  38.   
  39.     public Mail() {  
  40.     }  
  41.   
  42.     public Mail(String to, String from, String host, String username,  
  43.             String password, String subject, String content) {  
  44.         this.to = to;  
  45.         this.from = from;  
  46.         this.host = host;  
  47.         this.username = username;  
  48.         this.password = password;  
  49.         this.subject = subject;  
  50.         this.content = content;  
  51.     }  
  52.   
  53.     /** 
  54.      * 把主題轉換爲中文 
  55.      *  
  56.      * @param strText 
  57.      * @return 
  58.      */  
  59.     public String transferChinese(String strText) {  
  60.   
  61.         try {  
  62.             strText = MimeUtility.encodeText(new String(strText.getBytes(),  
  63.                     "GB2312"), "GB2312""B");  
  64.         } catch (Exception e) {  
  65.             e.printStackTrace();  
  66.         }  
  67.   
  68.         return strText;  
  69.     }  
  70.   
  71.     /** 
  72.      * 發送郵件 
  73.      *  
  74.      * @return 成功返回true,失敗返回false 
  75.      */  
  76.     public boolean sendMail() {  
  77.         // 構造mail session  
  78.         Properties props = System.getProperties();  
  79.         props.put("mail.smtp.host", host);  
  80.         props.put("mail.smtp.auth""true");  
  81.         Session session = Session.getDefaultInstance(props,  
  82.                 new Authenticator() {  
  83.                     public PasswordAuthentication getPasswordAuthentication() {  
  84.                         return new PasswordAuthentication(username, password);  
  85.                     }  
  86.                 });  
  87.         try {  
  88.             // 構造MimeMessage並設定基本的值,創建消息對象  
  89.             MimeMessage msg = new MimeMessage(session);  
  90.             // 設置消息內容  
  91.             msg.setFrom(new InternetAddress(from));  
  92.             System.out.println(from);  
  93.             // 把郵件地址映射到Internet地址上  
  94.             InternetAddress[] address = { new InternetAddress(to) };  
  95.             /** 
  96.              * setRecipient(Message.RecipientType type, Address 
  97.              * address),用於設置郵件的接收者。<br> 
  98.              * 有兩個參數,第一個參數是接收者的類型,第二個參數是接收者。<br> 
  99.              * 接收者類型可以是Message.RecipientType .TO,Message 
  100.              * .RecipientType.CC和Message.RecipientType.BCC,TO表示主要接收人,CC表示抄送人 
  101.              * ,BCC表示祕密抄送人。接收者與發送者一樣,通常使用InternetAddress的對象。 
  102.              */  
  103.             msg.setRecipients(Message.RecipientType.TO, address);  
  104.             // 設置郵件的標題  
  105.             subject = transferChinese(subject);  
  106.             msg.setSubject(subject);  
  107.             // 構造Multipart  
  108.             Multipart mp = new MimeMultipart();  
  109.   
  110.             // 向Multipart添加正文  
  111.             MimeBodyPart mbpContent = new MimeBodyPart();  
  112.             // 設置郵件內容(純文本格式)  
  113.             // mbpContent.setText(content);  
  114.             // 設置郵件內容(HTML格式)  
  115.             mbpContent.setContent(content, "text/html;charset=utf-8");  
  116.             // 向MimeMessage添加(Multipart代表正文)  
  117.             mp.addBodyPart(mbpContent);  
  118.             // 向Multipart添加MimeMessage  
  119.             msg.setContent(mp);  
  120.             // 設置郵件發送的時間。  
  121.             msg.setSentDate(new Date());  
  122.             // 發送郵件  
  123.             Transport.send(msg);  
  124.         } catch (Exception e) {  
  125.             e.printStackTrace();  
  126.             return false;  
  127.         }  
  128.         return true;  
  129.     }  
  130.   
  131.     public String getTo() {  
  132.         return to;  
  133.     }  
  134.   
  135.     public void setTo(String to) {  
  136.         this.to = to;  
  137.     }  
  138.   
  139.     public String getFrom() {  
  140.         return from;  
  141.     }  
  142.   
  143.     public void setFrom(String from) {  
  144.         this.from = from;  
  145.     }  
  146.   
  147.     public String getHost() {  
  148.         return host;  
  149.     }  
  150.   
  151.     public void setHost(String host) {  
  152.         this.host = host;  
  153.     }  
  154.   
  155.     public String getUsername() {  
  156.         return username;  
  157.     }  
  158.   
  159.     public void setUsername(String username) {  
  160.         this.username = username;  
  161.     }  
  162.   
  163.     public String getPassword() {  
  164.         return password;  
  165.     }  
  166.   
  167.     public void setPassword(String password) {  
  168.         this.password = password;  
  169.     }  
  170.   
  171.     public String getSubject() {  
  172.         return subject;  
  173.     }  
  174.   
  175.     public void setSubject(String subject) {  
  176.         this.subject = subject;  
  177.     }  
  178.   
  179.     public String getContent() {  
  180.         return content;  
  181.     }  
  182.   
  183.     public void setContent(String content) {  
  184.         this.content = content;  
  185.     }  
  186. }  

5.2.    寫個找回密碼的Action類

MemberAction.java:
  1. /** 
  2.  *  ClassName: MemberAction.java 
  3.  *  Created on 2011 
  4.  *  Copyrights 2011 hi.csdn.net/tjcyjd All rights reserved. 
  5.  *  site: http://hi.csdn.net/tjcyjd 
  6.  *  email: [email protected] 
  7.  */  
  8. package com.tjitcast.bbs.web.action.front;  
  9.   
  10. import org.apache.struts2.convention.annotation.Action;  
  11. import org.apache.struts2.convention.annotation.Namespace;  
  12. import org.apache.struts2.convention.annotation.ParentPackage;  
  13. import org.springframework.context.annotation.Scope;  
  14. import org.springframework.stereotype.Controller;  
  15.   
  16. import com.tjitcast.bbs.domain.Member;  
  17. import com.tjitcast.web.action.common.BaseAction;  
  18. import com.tjitcast.web.mail.Mail;  
  19.   
  20. /** 
  21.  * 會員找回密碼Action類 
  22.  *  
  23.  * @author yjd 
  24.  */  
  25. @Controller("front.memberAction")  
  26. @Scope("prototype")  
  27. @Namespace("/")  
  28. @ParentPackage("struts-default")  
  29. public class MemberAction extends BaseAction {  
  30.     private static final long serialVersionUID = -4631080996625964833L;  
  31.     private Member member;  
  32.   
  33.     /** 
  34.      * 找回密碼 
  35.      */  
  36.     @Action(value = "findpassword")  
  37.     public void findPassWord() {  
  38.         Member temp = memberService.get(member.getLoginname());  
  39.         if (temp != null) {  
  40.             String toMail = temp.getEmail();  
  41.             // String basePath = this.getBasePath();  
  42.             StringBuffer sb = new StringBuffer();  
  43.             sb.append("親愛的用戶 tjcyjd:您好!<br><br>");  
  44.             sb  
  45.                     .append("        您收到這封這封電子郵件是因爲您 (也可能是某人冒充您的名義) 申請了一個新的密碼。假如這不是您本人所申請, 請不用理會<br>這封電子郵件, 但是如果您持續收到這類的信件騷擾, 請您儘快聯絡管理員。<br><br>");  
  46.             sb  
  47.                     .append("        要使用新的密碼, 請使用以下鏈接啓用密碼。<br><br>");  
  48.             sb  
  49.                     .append("        <a href='http://passport.csdn.net/account/resetpassword?user=tjcyjd&active=jJTi9HgBmARmyittIJ7fBvzCtbvaz6FCXj0ZXJpn940=0'>http://passport.csdn.net/account/resetpassword?user=tjcyjd&active=jJTi9HgBmARmyittIJ7fBvzCtbvaz6FCXj0ZXJpn940=0</a>");  
  50.             sb  
  51.                     .append("<br><br><br>關注好友動態,請訪問CSDN個人空間:<a href='http://hi.csdn.net'>http://hi.csdn.net</a><br>");  
  52.             sb  
  53.                     .append("修改個人檔案資料,請訪問CSDN個人設置:<a href='http://passport.csdn.net/account/profile'>http://passport.csdn.net/account/profile</a><br>");  
  54.             sb  
  55.                     .append("技術精品文章,請訪問CSDN博客:<a href='http://blog.csdn.net/'>http://blog.csdn.net/</a><br>");  
  56.             sb  
  57.                     .append("全球最大的中文技術討論區,請訪問CSDN論壇:<a href='http://community.csdn.net/'>http://community.csdn.net/</a><br>");  
  58.             sb  
  59.                     .append("分享您認爲最好的內容,請訪問CSDN下載頻道:<a href='http://download.csdn.net/'>http://download.csdn.net/</a><br>");  
  60.             sb  
  61.                     .append("業界新聞、人才、外包 等等更多CSDN服務,請訪問<a href='http://www.csdn.net/'>http://www.csdn.net/</a><br>");  
  62.             sb.append("<br><br>我們將一如既往、熱忱的爲您服務!");  
  63.             sb  
  64.                     .append("<br><br>WWW.CSDN.NET - 中國最大的IT技術社區,爲IT專業技術人員提供最全面的信息傳播和服務平臺");  
  65.             sb  
  66.                     .append("<br>用戶服務支持:<a href='mailto:[email protected]'>[email protected]</a><br><br><br>");  
  67.             /** strm[1]第一個跟第二個@間內容,strm[strm.length - 1]最後一@內容 */  
  68.             String strm[] = toMail.split("@");  
  69.             // 創建郵件  
  70.             Mail mail = new Mail();  
  71.             mail.setTo(toMail);  
  72.             mail.setFrom("[email protected]");// 你的郵箱  
  73.             mail.setHost("smtp.163.com");  
  74.             mail.setUsername("[email protected]");// 用戶  
  75.             mail.setPassword("******");// 密碼  
  76.             mail.setSubject("[CSDN]找回您的賬戶密碼");  
  77.             mail.setContent(sb.toString());  
  78.             if (mail.sendMail()) {  
  79.                 renderText("您的申請已提交成功,請查看您的******" + strm[strm.length - 1]  
  80.                         + "郵箱。");  
  81.             } else {  
  82.                 renderText("操作失敗,輕稍後重新嘗試!");  
  83.             }  
  84.         } else {  
  85.             renderText("當前的用戶名不存在!");  
  86.         }  
  87.     }  
  88.   
  89.     public Member getMember() {  
  90.         return member;  
  91.     }  
  92.   
  93.     public void setMember(Member member) {  
  94.         this.member = member;  
  95.     }  
  96.   
  97. }  

5.3.    Jsp頁面訪問

find_password.jsp:
  1. <%@ page pageEncoding="UTF-8"%>  
  2. <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>  
  3. <%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>  
  4. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
  5. <html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>   
  6.     <title>CSDN找回密碼頁面</title>   
  7.     <script src="${basePath}/js/jquery.js" type="text/javascript"></script>   
  8.     <script src="${basePath}/js/jquery.md5.js" type="text/javascript"></script>  
  9.     <script src="${basePath}/js/checkcode.js" type="text/javascript"></script>  
  10.     <script src="${basePath}/js/jquery.blockUI.js" type="text/javascript"></script>  
  11.     <script src="${basePath}/js/jquery.bgiframe-2.1.2.js" type="text/javascript"></script>  
  12. <script src="${basePath}/js/jquery.validate.js" type="text/javascript"></script>  
  13. <script src="${basePath}/js/jquery.validate.messages_cn.js" type="text/javascript"></script>  
  14. <script type="text/javascript">  
  15. $(document).ready(function(){  
  16.     //找回密碼  
  17.     $("#findPassWord").click(function(){  
  18.         if(!/^.{3,}$/.test($("#loginname").val())){  
  19.             $("#msg").html("請輸入用戶名!");  
  20.             return false;  
  21.         }  
  22.         $.post("${basePath}/findpassword.htm?d="+new Date().getTime(), {"member.loginname":$("#loginname").val()}, function(data){  
  23.             if(data!="您輸入的用戶名不存在!"){  
  24.                 document.getElementById("findPassWord").disabled=true;  
  25.                 document.getElementById("loginname").disabled=true;  
  26.             }  
  27.             $("#msg").html(data);  
  28.         });  
  29.         return false;  
  30.     });  
  31. });  
  32. </script>   
  33.   </head>   
  34.   <body>    
  35.   <div class="main-wrap">  
  36.     <div id="main">   
  37.     <div class="t z">   
  38.     <table cellspacing="0" cellpadding="0" width="100%">   
  39.       <thead><tr><th class="h" colspan="2"><h2>找回密碼</h2></th></tr></thead>   
  40.       <tbody>   
  41.         <tr class="tr2"><td align="center" style="line-height: 30px"><font style="color: red;font-weight: bolder;">${msg}</font></td></tr>   
  42.         <tr class="tr2">   
  43.           <td align="left">   
  44.           <form id="loginForm" action="${basePath}/login.htm" method="post" class="validateForm">  
  45.           <input type="hidden" id="redirectUrl" name="redirectUrl" value="${redirectUrl}" />  
  46.             <table cellspacing="0" cellpadding="0" width="200" align="center" border="0">   
  47.               <tbody>   
  48.                 <tr><td></td>  
  49.                     <td align="left">請輸入用戶名</td>  
  50.                 </tr>   
  51.                 <tr>  
  52.                     <td align="right" width="40%">用戶名:</td>   
  53.                     <td><input class="required input" id="loginname" title="用戶名不能爲空" size="15" name="member.loginname" type="text" /> <span id="msg" style="color:red"></span></td>   
  54.                 </tr>   
  55.                 <tr><td></td>  
  56.                     <td colspan="2"><input id="findPassWord" class="bta" type="button" style="vertical-align: middle" value=" 下 一 步 " /></td>  
  57.                 </tr>   
  58.               </tbody>   
  59.             </table>   
  60.           </form>   
  61.           </td>   
  62.         </tr>   
  63.       </tbody>   
  64.     </table>   
  65.     </div>   
  66.     </div>   
  67.     </div>   
  68.   </body>   
  69. </html>  

5.4.    效果展示

find_password.jsp頁面:



用戶郵箱收到的信息:




發佈了11 篇原創文章 · 獲贊 1 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章