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";
}
}