后台登陆界面之忘记密码功能的实现(通过邮件重置密码)
后台登陆界面之忘记密码功能的实现(通过邮件重置密码)
这两天接触到了忘记密码这个功能,在网上查了好久的资料,虽然原理很多部分还没有理解,但是功能已经实现。
下面实现的代码,放到这里以备后用。
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 }