springmvc 邮箱发送验证码
这是基于mave项目,springmvc的邮箱发送验证码。
要实现发送验证码,无论你是使用网易邮箱还是qq邮箱,
都要开启POP3/SMTP服务 ,获取一个授权码。
项目部署如下图:
1. 创建web的maven项目,导入一下包,pom.xml文件的配置如下:
<!-- spring的依赖包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
<!-- 邮件发送的支持包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
<!-- 邮件发送 -->
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.7</version>
</dependency>
2. spring-beans.xml文件里面需要配置发件人的账号和密码(即授权码)
<!-- class:发送邮件的核心代码的位置 -->
<bean id="sendMailUtil" class="com.yjj.email.util.SendMailUtil">
<!-- 给属性赋值 name:账号 pwd:授权码 -->
<property name="sendEmail" value="yinjing89889@163.com"></property>
<property name="pwd" value="IDYARWQUPSSUGM"></property>
</bean>
3.SendMailUtil.java邮箱发送的具体代码:
package com.yjj.email.util;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Properties;
import javax.mail.internet.MimeMessage;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.mail.javamail.MimeMessageHelper;
public class SendMailUtil {
private String sendEmail;//发件箱
private String pwd;//发件箱的授权码
public void setSendEmail(String sendEmail) {
this.sendEmail = sendEmail;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
/**
* 发送html格式的邮件
* @param receiveEmail 收件箱
* @param name 称呼
* @param code 验证码
* @return
*/
public boolean sendHtmlMail(String receiveEmail,String name,String code){
try {
JavaMailSenderImpl senderImpl=new JavaMailSenderImpl();
//邮箱的主机 如果是qq邮箱就是smtp.qq.com
senderImpl.setHost("smtp.163.com");
//编码集
senderImpl.setDefaultEncoding("utf-8");
//建立邮件消息,我们需要发送的是html格式邮件
MimeMessage mimeMessage=senderImpl.createMimeMessage();
MimeMessageHelper messageHelper=new MimeMessageHelper(mimeMessage);
//设置收件人,寄件人
messageHelper.setTo(receiveEmail);//收件人
messageHelper.setFrom(sendEmail);//发件人
messageHelper.setSubject("relax酒店预订系统");//设置邮件的主题
SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
String str="<!DOCTYPE html><html><head><meta charset='UTF-8'></head><body>"
+"<p style='font-size:20px;font-weight:blod;'>尊敬的:"+ name +",您好</p>"
+"<p style='text-indent:2em;font-size:20px'>欢迎使用relax酒店预订系统,您本次的验证码是"
+"<span style='font-size:30px; font-weight:blod; color:red;'>"+ code +"</span>"
+",3分钟之内有效,请尽快使用!</p><p style='text-align:right; padding-right:20px;'>"
+"<a href='http://www.hyycinfo.com' style='font-size18px;'>长沙市relax酒店</a></p>"
+"<span style='font-size:18px; float:right; margin-right:60px;'>"+ sdf.format(new Date()) +"</span></body></html>";
//设置邮件的正文
messageHelper.setText(str,true);
//发件箱的名称
senderImpl.setUsername(sendEmail);
//发件箱的密码 状态码
senderImpl.setPassword(pwd);
Properties prop=new Properties();
prop.put("mail.smtp.auth", "true");//让服务器去认证用户名和密码
prop.put("mail.smtp.timeout", "2500");//连接超时时间
senderImpl.setJavaMailProperties(prop);
senderImpl.send(mimeMessage);
return true;
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
}
4.SendEmail.java 控制器代码,处理前端请求的
package com.yjj.email.controller;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;
import javax.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.yjj.email.util.SendMailUtil;
@Controller
public class SendEmail {
@Autowired
private SendMailUtil sendMailUtil;
@RequestMapping("/code")
@ResponseBody
public int sendEmail(String email,HttpSession session){
String code="";
//随机产生验证码
Random rd=new Random();
while(code.length()<6){
code+=rd.nextInt(10);
}
//如果验证码发送成功
if(sendMailUtil.sendHtmlMail(email, "yjjs", code)){
session.setAttribute("vcode", code);
//创建TimerTask用来三分钟之后移出vcode
TimerTask task=new TimerTask(){
@Override
public void run() {
session.removeAttribute("vcode");
}
};
//实例化这个task任务
Timer timer=new Timer();
timer.schedule(task, 180000);//三分钟之后执行task任务
return 1;
}
return 0;
}
}
5.login.html 前端界面代码,为了方便测试,只是简单的写了一下,当点击发送验证码时,发送请求
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>邮箱发送</title>
</head>
<body>
邮箱:<input placeholder="请输入你的邮箱" id="email" name="email"><br>
<input type="button" value="发送验证码" onclick="sendEmail()">
</body>
<script src="js/jquery-1.11.3.js"></script>
<script>
function sendEmail(){
//获取收件邮箱
var email=$("#email").val();
if(email==null || email==""){
return;
}
//发送请求
$.post("code",{email:email},function(data){
console.log(data);
},"text");
}
</script>
</html>
网易邮箱获取授权码方式:
设置–>POP3/SMTP/IMAP
如果是关闭状态,开启之后就会有一个授权码。(我的是已经开启了所以显示已开启)
QQ邮箱获取授权码方式:
设置–>账户
下拉找到POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务
只需要开启第一项就可以了,就可以获取一个授权码