1.实体类字段——发送邮件所需的字段
public class EmailVO implements Serializable{
// 主机名,就是邮件服务器 例如:smtp.163.com
private String host;
// 发件人的邮箱的用户名
private String username;
// 发件人的邮箱的密码
private String password;
// 发件人的邮箱, 与用户名一致
private String from;
// 邮件内容
private String content;
// 邮件主题
private String subject;
// 收件人
private String to;
........
}
2.获取发送人邮箱信息 发送邮件到客户邮箱进行验证
@RequestMapping("/email/send")
public String send(Model model, String userEmail, String username) {
//判断是否有参数传入
if(username == null || "".equals(username) || userEmail ==null || "".equals(userEmail)){
return "password_1";
}
EmailVO emailVo = new EmailVO();
//从数据库中读取发送人的信息
EmailConfig email = emailSrv.queryEmail(1L);
emailVo.setSubject(email.getSubject());
emailVo.setUsername(email.getUsername());
emailVo.setHost(email.getHost());
emailVo.setFrom(email.getFrom());
emailVo.setPassword(email.getPassword());
//你要发给谁的邮箱
emailVo.setTo(userEmail);
// 从配置文件中读取发送人的信息
ResourceBundle rb = ResourceBundle.getBundle("mail");
String emailurl = rb.getString("emailurl");
//获取当前时间
Date currentTime = new Date();
//盐值获取--
String salt = Encrypt.md5(username, String.valueOf(currentTime));
//发送内容
emailVo.setContent(MessageFormat.format(email.getContent(), emailurl, username, salt));
EmailLog emailLog = new EmailLog();
try {
//根据用户名查询数据库中是否有 用户信息
emailLog.setUsername(username);
EmailLog isEmail = emailLogSrv.queryByWhere(emailLog);
if(isEmail == null){
//获取当前的记录信息
emailLog.setUsername(username);
emailLog.setSalt(salt);
emailLog.setEmailStatus(0);
emailLog.setCreateTime(currentTime);
emailLog.setUpdateTime(currentTime);
//添加新记录
emailLogSrv.saveEmail(emailLog);
}else{
//修改当前的记录信息
isEmail.setSalt(salt);
isEmail.setEmailStatus(0);
isEmail.setUpdateTime(currentTime);
emailLogSrv.update(isEmail);
}
//发送邮件给客户
sendMail.sendMail(emailVo);
} catch (Exception e) {
e.printStackTrace();
model.addAttribute("resultMsg", "邮件发送失败!");
return "password_1";
}
model.addAttribute("isSend", 1);
return "password_2";
}
3.创建邮件信息对象发送
public class EmailService {
// 因为匿名内部类里面用到了这个类的属性,所以要设置为final
public void sendMail(final EmailVO email) throws Exception {
// 读取资源文件
Properties props = new Properties();
props.setProperty("mail.smtp.auth", "true");
props.setProperty("mail.smtp.host", email.getHost());
/**
* 创建认证
*/
Authenticator auth = new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(email.getUsername(), email.getPassword());
}
};
Session session = Session.getInstance(props, auth);
// 创建邮件信息的对像
MimeMessage msg = new MimeMessage(session);
msg.setFrom(new InternetAddress(email.getFrom(),"中国盲文图书馆管理员","UTF-8"));
msg.setRecipients(RecipientType.TO, email.getTo());
msg.setSubject(email.getSubject());
msg.setContent(email.getContent(), "text/html;charset=UTF-8");
// 发送邮件
Transport.send(msg);
}
}
4.邮箱认证
@RequestMapping("/forget/password/3")
public String pass(Model model, String username, String salt) {
if(username == null || salt == null){
return "password_1";
}
EmailLog emailLog = new EmailLog();
//根据用户名查询数据库中的 用户信息
emailLog.setUsername(username);
EmailLog isEmail = emailLogSrv.queryByWhere(emailLog);
String saltLog = isEmail.getSalt();
Integer state = isEmail.getEmailStatus();
Long date = isEmail.getUpdateTime().getTime();
//获取当前时间与修改时间进行相减 看看是否大于30分钟
Long current = new Date().getTime();
Long isLarge = current - date;
//三十分钟有效时间
Long thirty = (long) (1000 * 60 * 30);
if(thirty > isLarge && salt.equals(saltLog) && 0 == state){
//修改记录信息 返回修改页面继续修改
isEmail.setEmailStatus(1);
isEmail.setUpdateTime(new Date());
emailLogSrv.update(isEmail);
model.addAttribute("username", username);
return "password_3";
}else{
model.addAttribute("resultMsg", "链接已失效,请重新操作!");
return "password_1";
}
}