1. 理解三個名詞
1.1. 什麼是SMTP:
SMTP(Simple Mail Transfer):簡單郵件傳輸協議。它定義了發送電子郵件的機制,是一組用於由源地址到目的地址傳送郵件的規則,由它來控制郵件的中轉方式。該協議屬於TCP/IP協議族,幫助每臺計算機在發送或中轉信件時找到下一個目的。SMTP服務器可將消息中轉至接收方SMTP服務器,以便最終讓用戶經由POP或IMAP獲得。
1.2. 什麼是POP:
1.3. 什麼是IMAP:
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類庫:
3.2. JAF類庫:
到到官網進行下載,並將activation.jar添加到應用的類路徑中。
4. JavaMail發送郵件三大步驟
4.1. 創建會話(javax.mail.Session)
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 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)
5. 使用JavaMail模仿CSDN找回密碼的功能
5.1. 寫個Mail類,包含郵件所需各參數及發件功能
- /**
- * ClassName: Mail.java
- * Created on 2011
- * Copyrights 2011 hi.csdn.net/tjcyjd All rights reserved.
- * site: http://hi.csdn.net/tjcyjd
- * email: [email protected]
- */
- package com.tjcyjd.web.mail;
- import java.util.Date;
- import java.util.Properties;
- import javax.mail.Authenticator;
- import javax.mail.Message;
- import javax.mail.Multipart;
- import javax.mail.PasswordAuthentication;
- import javax.mail.Session;
- import javax.mail.Transport;
- import javax.mail.internet.MimeBodyPart;
- import javax.mail.internet.MimeMessage;
- import javax.mail.internet.MimeMultipart;
- import javax.mail.internet.MimeUtility;
- import javax.mail.internet.InternetAddress;
- /**
- * Mail實體類(包含發件功能)
- *
- * @author yjd
- */
- public class Mail {
- String to = ""; // 收件人
- String from = ""; // 發件人
- String host = ""; // smtp主機
- String username = ""; // 用戶名
- String password = ""; // 密碼
- String subject = ""; // 郵件主題
- String content = ""; // 郵件正文
- public Mail() {
- }
- public Mail(String to, String from, String host, String username,
- String password, String subject, String content) {
- this.to = to;
- this.from = from;
- this.host = host;
- this.username = username;
- this.password = password;
- this.subject = subject;
- this.content = content;
- }
- /**
- * 把主題轉換爲中文
- *
- * @param strText
- * @return
- */
- public String transferChinese(String strText) {
- try {
- strText = MimeUtility.encodeText(new String(strText.getBytes(),
- "GB2312"), "GB2312", "B");
- } catch (Exception e) {
- e.printStackTrace();
- }
- return strText;
- }
- /**
- * 發送郵件
- *
- * @return 成功返回true,失敗返回false
- */
- public boolean sendMail() {
- // 構造mail session
- Properties props = System.getProperties();
- props.put("mail.smtp.host", host);
- props.put("mail.smtp.auth", "true");
- Session session = Session.getDefaultInstance(props,
- new Authenticator() {
- public PasswordAuthentication getPasswordAuthentication() {
- return new PasswordAuthentication(username, password);
- }
- });
- try {
- // 構造MimeMessage並設定基本的值,創建消息對象
- MimeMessage msg = new MimeMessage(session);
- // 設置消息內容
- msg.setFrom(new InternetAddress(from));
- System.out.println(from);
- // 把郵件地址映射到Internet地址上
- InternetAddress[] address = { new InternetAddress(to) };
- /**
- * setRecipient(Message.RecipientType type, Address
- * address),用於設置郵件的接收者。<br>
- * 有兩個參數,第一個參數是接收者的類型,第二個參數是接收者。<br>
- * 接收者類型可以是Message.RecipientType .TO,Message
- * .RecipientType.CC和Message.RecipientType.BCC,TO表示主要接收人,CC表示抄送人
- * ,BCC表示祕密抄送人。接收者與發送者一樣,通常使用InternetAddress的對象。
- */
- msg.setRecipients(Message.RecipientType.TO, address);
- // 設置郵件的標題
- subject = transferChinese(subject);
- msg.setSubject(subject);
- // 構造Multipart
- Multipart mp = new MimeMultipart();
- // 向Multipart添加正文
- MimeBodyPart mbpContent = new MimeBodyPart();
- // 設置郵件內容(純文本格式)
- // mbpContent.setText(content);
- // 設置郵件內容(HTML格式)
- mbpContent.setContent(content, "text/html;charset=utf-8");
- // 向MimeMessage添加(Multipart代表正文)
- mp.addBodyPart(mbpContent);
- // 向Multipart添加MimeMessage
- msg.setContent(mp);
- // 設置郵件發送的時間。
- msg.setSentDate(new Date());
- // 發送郵件
- Transport.send(msg);
- } catch (Exception e) {
- e.printStackTrace();
- return false;
- }
- return true;
- }
- public String getTo() {
- return to;
- }
- public void setTo(String to) {
- this.to = to;
- }
- public String getFrom() {
- return from;
- }
- public void setFrom(String from) {
- this.from = from;
- }
- public String getHost() {
- return host;
- }
- public void setHost(String host) {
- this.host = host;
- }
- 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 getSubject() {
- return subject;
- }
- public void setSubject(String subject) {
- this.subject = subject;
- }
- public String getContent() {
- return content;
- }
- public void setContent(String content) {
- this.content = content;
- }
- }
5.2. 寫個找回密碼的Action類
- /**
- * ClassName: MemberAction.java
- * Created on 2011
- * Copyrights 2011 hi.csdn.net/tjcyjd All rights reserved.
- * site: http://hi.csdn.net/tjcyjd
- * email: [email protected]
- */
- package com.tjitcast.bbs.web.action.front;
- import org.apache.struts2.convention.annotation.Action;
- import org.apache.struts2.convention.annotation.Namespace;
- import org.apache.struts2.convention.annotation.ParentPackage;
- import org.springframework.context.annotation.Scope;
- import org.springframework.stereotype.Controller;
- import com.tjitcast.bbs.domain.Member;
- import com.tjitcast.web.action.common.BaseAction;
- import com.tjitcast.web.mail.Mail;
- /**
- * 會員找回密碼Action類
- *
- * @author yjd
- */
- @Controller("front.memberAction")
- @Scope("prototype")
- @Namespace("/")
- @ParentPackage("struts-default")
- public class MemberAction extends BaseAction {
- private static final long serialVersionUID = -4631080996625964833L;
- private Member member;
- /**
- * 找回密碼
- */
- @Action(value = "findpassword")
- public void findPassWord() {
- Member temp = memberService.get(member.getLoginname());
- if (temp != null) {
- String toMail = temp.getEmail();
- // String basePath = this.getBasePath();
- StringBuffer sb = new StringBuffer();
- sb.append("親愛的用戶 tjcyjd:您好!<br><br>");
- sb
- .append(" 您收到這封這封電子郵件是因爲您 (也可能是某人冒充您的名義) 申請了一個新的密碼。假如這不是您本人所申請, 請不用理會<br>這封電子郵件, 但是如果您持續收到這類的信件騷擾, 請您儘快聯絡管理員。<br><br>");
- sb
- .append(" 要使用新的密碼, 請使用以下鏈接啓用密碼。<br><br>");
- sb
- .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>");
- sb
- .append("<br><br><br>關注好友動態,請訪問CSDN個人空間:<a href='http://hi.csdn.net'>http://hi.csdn.net</a><br>");
- sb
- .append("修改個人檔案資料,請訪問CSDN個人設置:<a href='http://passport.csdn.net/account/profile'>http://passport.csdn.net/account/profile</a><br>");
- sb
- .append("技術精品文章,請訪問CSDN博客:<a href='http://blog.csdn.net/'>http://blog.csdn.net/</a><br>");
- sb
- .append("全球最大的中文技術討論區,請訪問CSDN論壇:<a href='http://community.csdn.net/'>http://community.csdn.net/</a><br>");
- sb
- .append("分享您認爲最好的內容,請訪問CSDN下載頻道:<a href='http://download.csdn.net/'>http://download.csdn.net/</a><br>");
- sb
- .append("業界新聞、人才、外包 等等更多CSDN服務,請訪問<a href='http://www.csdn.net/'>http://www.csdn.net/</a><br>");
- sb.append("<br><br>我們將一如既往、熱忱的爲您服務!");
- sb
- .append("<br><br>WWW.CSDN.NET - 中國最大的IT技術社區,爲IT專業技術人員提供最全面的信息傳播和服務平臺");
- sb
- .append("<br>用戶服務支持:<a href='mailto:[email protected]'>[email protected]</a><br><br><br>");
- /** strm[1]第一個跟第二個@間內容,strm[strm.length - 1]最後一@內容 */
- String strm[] = toMail.split("@");
- // 創建郵件
- Mail mail = new Mail();
- mail.setTo(toMail);
- mail.setFrom("[email protected]");// 你的郵箱
- mail.setHost("smtp.163.com");
- mail.setUsername("[email protected]");// 用戶
- mail.setPassword("******");// 密碼
- mail.setSubject("[CSDN]找回您的賬戶密碼");
- mail.setContent(sb.toString());
- if (mail.sendMail()) {
- renderText("您的申請已提交成功,請查看您的******" + strm[strm.length - 1]
- + "郵箱。");
- } else {
- renderText("操作失敗,輕稍後重新嘗試!");
- }
- } else {
- renderText("當前的用戶名不存在!");
- }
- }
- public Member getMember() {
- return member;
- }
- public void setMember(Member member) {
- this.member = member;
- }
- }
5.3. Jsp頁面訪問
- <%@ page pageEncoding="UTF-8"%>
- <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
- <%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
- <title>CSDN找回密碼頁面</title>
- <script src="${basePath}/js/jquery.js" type="text/javascript"></script>
- <script src="${basePath}/js/jquery.md5.js" type="text/javascript"></script>
- <script src="${basePath}/js/checkcode.js" type="text/javascript"></script>
- <script src="${basePath}/js/jquery.blockUI.js" type="text/javascript"></script>
- <script src="${basePath}/js/jquery.bgiframe-2.1.2.js" type="text/javascript"></script>
- <script src="${basePath}/js/jquery.validate.js" type="text/javascript"></script>
- <script src="${basePath}/js/jquery.validate.messages_cn.js" type="text/javascript"></script>
- <script type="text/javascript">
- $(document).ready(function(){
- //找回密碼
- $("#findPassWord").click(function(){
- if(!/^.{3,}$/.test($("#loginname").val())){
- $("#msg").html("請輸入用戶名!");
- return false;
- }
- $.post("${basePath}/findpassword.htm?d="+new Date().getTime(), {"member.loginname":$("#loginname").val()}, function(data){
- if(data!="您輸入的用戶名不存在!"){
- document.getElementById("findPassWord").disabled=true;
- document.getElementById("loginname").disabled=true;
- }
- $("#msg").html(data);
- });
- return false;
- });
- });
- </script>
- </head>
- <body>
- <div class="main-wrap">
- <div id="main">
- <div class="t z">
- <table cellspacing="0" cellpadding="0" width="100%">
- <thead><tr><th class="h" colspan="2"><h2>找回密碼</h2></th></tr></thead>
- <tbody>
- <tr class="tr2"><td align="center" style="line-height: 30px"><font style="color: red;font-weight: bolder;">${msg}</font></td></tr>
- <tr class="tr2">
- <td align="left">
- <form id="loginForm" action="${basePath}/login.htm" method="post" class="validateForm">
- <input type="hidden" id="redirectUrl" name="redirectUrl" value="${redirectUrl}" />
- <table cellspacing="0" cellpadding="0" width="200" align="center" border="0">
- <tbody>
- <tr><td></td>
- <td align="left">請輸入用戶名</td>
- </tr>
- <tr>
- <td align="right" width="40%">用戶名:</td>
- <td><input class="required input" id="loginname" title="用戶名不能爲空" size="15" name="member.loginname" type="text" /> <span id="msg" style="color:red"></span></td>
- </tr>
- <tr><td></td>
- <td colspan="2"><input id="findPassWord" class="bta" type="button" style="vertical-align: middle" value=" 下 一 步 " /></td>
- </tr>
- </tbody>
- </table>
- </form>
- </td>
- </tr>
- </tbody>
- </table>
- </div>
- </div>
- </div>
- </body>
- </html>