后台登陸界面之忘記密碼功能的實現(通過郵件重置密碼)
這兩天接觸到了忘記密碼這個功能,在網上查了好久的資料,雖然原理很多部分還沒有理解,但是功能已經實現。
下面實現的代碼,放到這里以備后用。
1.發送郵件需要的基本信息。
1 package edu.bookstore.util; 2 3 /** 4 * 發送郵件需要使用的基本信息 5 */ 6 import java.util.Properties;
7 public class MailSenderInfo { 8 // 發送郵件的服務器的IP和端口 9 private String mailServerHost; 10 private String mailServerPort = "25"; 11 // 郵件發送者的地址 12 private String fromAddress; 13 // 郵件接收者的地址 14 private String toAddress; 15 // 登陸郵件發送服務器的用戶名和密碼 16 private String userName; 17 private String password; 18 // 是否需要身份驗證 19 private boolean validate = false; 20 // 郵件主題 21 private String subject; 22 // 郵件的文本內容 23 private String content; 24 // 郵件附件的文件名 25 private String[] attachFileNames; 26 /** 27 * 獲得郵件會話屬性 28 */ 29 public Properties getProperties(){ 30 Properties p = new Properties(); 31 p.put("mail.smtp.host", this.mailServerHost); 32 p.put("mail.smtp.port", this.mailServerPort); 33 p.put("mail.smtp.auth", validate ? "true" : "false"); 34 return p; 35 } 36 public String getMailServerHost() { 37 return mailServerHost; 38 } 39 public void setMailServerHost(String mailServerHost) { 40 this.mailServerHost = mailServerHost; 41 } 42 public String getMailServerPort() { 43 return mailServerPort; 44 } 45 public void setMailServerPort(String mailServerPort) { 46 this.mailServerPort = mailServerPort; 47 } 48 public boolean isValidate() { 49 return validate; 50 } 51 public void setValidate(boolean validate) { 52 this.validate = validate; 53 } 54 public String[] getAttachFileNames() { 55 return attachFileNames; 56 } 57 public void setAttachFileNames(String[] fileNames) { 58 this.attachFileNames = fileNames; 59 } 60 public String getFromAddress() { 61 return fromAddress; 62 } 63 public void setFromAddress(String fromAddress) { 64 this.fromAddress = fromAddress; 65 } 66 public String getPassword() { 67 return password; 68 } 69 public void setPassword(String password) { 70 this.password = password; 71 } 72 public String getToAddress() { 73 return toAddress; 74 } 75 public void setToAddress(String toAddress) { 76 this.toAddress = toAddress; 77 } 78 public String getUserName() { 79 return userName; 80 } 81 public void setUserName(String userName) { 82 this.userName = userName; 83 } 84 public String getSubject() { 85 return subject; 86 } 87 public void setSubject(String subject) { 88 this.subject = subject; 89 } 90 public String getContent() { 91 return content; 92 } 93 public void setContent(String textContent) { 94 this.content = textContent; 95 } 96 }
2.郵件密碼驗證。
1 package edu.bookstore.util; 2 3 import javax.mail.Authenticator; 4 import javax.mail.PasswordAuthentication; 5 6 7 public class MyAuthenticator extends Authenticator{ 8 String userName=null; 9 String password=null; 10 11 public MyAuthenticator(){ 12 } 13 public MyAuthenticator(String username, String password) { 14 this.userName = username; 15 this.password = password; 16 } 17 protected PasswordAuthentication getPasswordAuthentication(){ 18 return new PasswordAuthentication(userName, password); 19 } 20 }
3.簡單郵件(不帶附件的郵件)發送器
1 package edu.bookstore.util; 2 3 4 import java.util.Date; 5 import java.util.Properties; 6 import javax.mail.Address; 7 import javax.mail.BodyPart; 8 import javax.mail.Message; 9 import javax.mail.MessagingException; 10 import javax.mail.Multipart; 11 import javax.mail.Session; 12 import javax.mail.Transport; 13 import javax.mail.internet.InternetAddress; 14 import javax.mail.internet.MimeBodyPart; 15 import javax.mail.internet.MimeMessage; 16 import javax.mail.internet.MimeMultipart; 17 18 /** 19 * 簡單郵件(不帶附件的郵件)發送器 20 */ 21 public class SimpleMailSender { 22 /** 23 * 以文本格式發送郵件 24 * @param mailInfo 待發送的郵件的信息 25 */ 26 public boolean sendTextMail(MailSenderInfo mailInfo) { 27 // 判斷是否需要身份認證 28 MyAuthenticator authenticator = null; 29 Properties pro = mailInfo.getProperties(); 30 if (mailInfo.isValidate()) { 31 // 如果需要身份認證,則創建一個密碼驗證器 32 authenticator = new MyAuthenticator(mailInfo.getUserName(), mailInfo.getPassword()); 33 } 34 // 根據郵件會話屬性和密碼驗證器構造一個發送郵件的session 35 Session sendMailSession = Session.getDefaultInstance(pro,authenticator); 36 try { 37 // 根據session創建一個郵件消息 38 Message mailMessage = new MimeMessage(sendMailSession); 39 // 創建郵件發送者地址 40 Address from = new InternetAddress(mailInfo.getFromAddress()); 41 // 設置郵件消息的發送者 42 mailMessage.setFrom(from); 43 // 創建郵件的接收者地址,並設置到郵件消息中 44 Address to = new InternetAddress(mailInfo.getToAddress()); 45 mailMessage.setRecipient(Message.RecipientType.TO,to); 46 // 設置郵件消息的主題 47 mailMessage.setSubject(mailInfo.getSubject()); 48 // 設置郵件消息發送的時間 49 mailMessage.setSentDate(new Date()); 50 // 設置郵件消息的主要內容 51 String mailContent = mailInfo.getContent(); 52 mailMessage.setText(mailContent); 53 // 發送郵件 54 Transport.send(mailMessage); 55 return true; 56 } catch (MessagingException ex) { 57 ex.printStackTrace(); 58 } 59 return false; 60 } 61 62 /** 63 * 以HTML格式發送郵件 64 * @param mailInfo 待發送的郵件信息 65 */ 66 public static boolean sendHtmlMail(MailSenderInfo mailInfo){ 67 // 判斷是否需要身份認證 68 MyAuthenticator authenticator = null; 69 Properties pro = mailInfo.getProperties(); 70 //如果需要身份認證,則創建一個密碼驗證器 71 if (mailInfo.isValidate()) { 72 authenticator = new MyAuthenticator(mailInfo.getUserName(), mailInfo.getPassword()); 73 } 74 // 根據郵件會話屬性和密碼驗證器構造一個發送郵件的session 75 Session sendMailSession = Session.getDefaultInstance(pro,authenticator); 76 try { 77 // 根據session創建一個郵件消息 78 Message mailMessage = new MimeMessage(sendMailSession); 79 // 創建郵件發送者地址 80 Address from = new InternetAddress(mailInfo.getFromAddress()); 81 // 設置郵件消息的發送者 82 mailMessage.setFrom(from); 83 // 創建郵件的接收者地址,並設置到郵件消息中 84 Address to = new InternetAddress(mailInfo.getToAddress()); 85 // Message.RecipientType.TO屬性表示接收者的類型為TO 86 mailMessage.setRecipient(Message.RecipientType.TO,to); 87 // 設置郵件消息的主題 88 mailMessage.setSubject(mailInfo.getSubject()); 89 // 設置郵件消息發送的時間 90 mailMessage.setSentDate(new Date()); 91 // MiniMultipart類是一個容器類,包含MimeBodyPart類型的對象 92 Multipart mainPart = new MimeMultipart(); 93 // 創建一個包含HTML內容的MimeBodyPart 94 BodyPart html = new MimeBodyPart(); 95 // 設置HTML內容 96 html.setContent(mailInfo.getContent(), "text/html; charset=utf-8"); 97 mainPart.addBodyPart(html); 98 // 將MiniMultipart對象設置為郵件內容 99 mailMessage.setContent(mainPart); 100 // 發送郵件 101 Transport.send(mailMessage); 102 return true; 103 } catch (MessagingException ex) { 104 ex.printStackTrace(); 105 } 106 return false; 107 } 108 }
4.郵件發送的准備。(這里需要注意的是,郵件的密碼不能真實的密碼。必須為郵件的授權碼)
1 package edu.bookstore.util; 2 3 public class MyEamil { 4 5 public static Boolean sendMail(String Email) { 6 7 boolean flag = false; 8 //這個類主要是設置郵件 9 MailSenderInfo mailInfo = new MailSenderInfo(); 10 mailInfo.setMailServerHost("smtp.qq.com"); 11 mailInfo.setMailServerPort("25"); 12 mailInfo.setValidate(true); 13 mailInfo.setUserName("xxxxxxxxx@qq.com"); 14 mailInfo.setPassword("xxxxxxxxxxx");//這里要注意。不能是郵箱的密碼,要是郵箱的授權碼。 15 mailInfo.setFromAddress("xxxxxxx@qq.com"); 16 mailInfo.setToAddress(Email); 17 mailInfo.setSubject("重置密碼"); 18 mailInfo.setContent("您的重置密碼為:xxx"); 19 //這個類主要來發送郵件 20 SimpleMailSender sms = new SimpleMailSender(); 21 sms.sendTextMail(mailInfo);//發送文體格式 22 // sms.sendHtmlMail(mailInfo);//發送html格式 23 24 flag = true; 25 26 return flag; 27 28 } 29 }
