前期设置
登录你的QQ邮箱,设置==>>账户,开启授权服务
按照qq官方系统提示操作完成后,会得到一个授权码,这个时候需要复制下来,后面需要用到
springboot项目的创建就不说了,说关键的地方;
pom.xml
<!--email-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
<!--模板引擎-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
application.yml
# 邮箱配置
mail:
# 配置 SMTP 服务器地址
host: smtp.qq.com
# 发送者邮箱
username: 589xxxx56@qq.com
# 配置密码,注意不是真正的密码,而是刚刚申请到的授权码
password: tfpczrcnxkfybahf
# 端口号465或587
port: 587
# 默认的邮件编码为UTF-8
default-encoding: UTF-8
# 配置SSL 加密工厂
properties:
mail:
smtp:
socketFactoryClass: javax.net.ssl.SSLSocketFactory
#表示开启 DEBUG 模式,这样,邮件发送过程的日志会在控制台打印出来,方便排查错误
debug: true
验证码模版
mailtemplate.ftl
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Email Verification Code</title>
</head>
<body style="margin: 0; padding: 0; background-color: #f5f5f5;">
<div style="max-width: 600px; margin: 0 auto;">
<table cellpadding="0" cellspacing="0" align="center" style="width: 100%; border-collapse: collapse; background-color: #ffffff; font-family: Arial, sans-serif;">
<tr>
<th valign="middle" style="height: 60px; padding: 20px; background-color: #0074d3; border-radius: 5px 5px 0 0;">
<h1 style="margin: 0; color: #ffffff; font-size: 24px;">TITLE</h1>
</th>
</tr>
<tr>
<td style="padding: 20px;">
<div style="background-color: #ffffff; padding: 25px;">
<h2 style="margin: 10px 0; font-size: 18px; color: #333333;">
尊敬的用户,
</h2>
<p style="margin: 10px 0; font-size: 16px; color: #333333;">
感谢您注册我们的产品. 您的账号正在进行电子邮件验证.
</p>
<p style="margin: 10px 0; font-size: 16px; color: #333333;">
验证码为: <span style="color: #1100ff;">{0}</span>
</p>
<p style="margin: 10px 0; font-size: 16px; color: #333333;">
验证码的有效期只有一分钟,请抓紧时间进行验证吧!
</p>
<p style="margin: 10px 0; font-size: 16px; color: #dc1818;">
如果非本人操作,请忽略此邮件
</p>
</div>
</td>
</tr>
<tr>
<td style="text-align: center; padding: 20px; background-color: #f5f5f5;">
<p style="margin: 0; font-size: 12px; color: #747474;">
XXXXX<br>
Contact us: XXXXXXX@qq.com
</p>
<p style="margin: 10px 0; font-size: 12px; color: #747474;">
This is an automated email, please do not reply.<br>
© Company Name
</p>
</td>
</tr>
</table>
</div>
</body>
</html>
验证码模版最好是由table标签来编写,这个好像是邮箱才能识别到的样式,核心是不能缺少 {0}
自定义邮箱验证码模型类
public class CodeEntity {
private String code;
private String msg;
public CodeEntity() {
}
public CodeEntity(String code,String msg) {
this.code = code;
this.msg = msg;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
设置模版邮箱引擎
EmailEngine.java
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.text.MessageFormat;
public class EmailEngine {
/**
* 读取邮件模板
* 替换模板中的信息
*/
public String buildContent(String title) {
//加载邮件html模板
Resource resource = new ClassPathResource("templates/mailtemplate.ftl");
InputStream inputStream = null;
BufferedReader fileReader = null;
StringBuffer buffer = new StringBuffer();
String line = "";
try {
inputStream = resource.getInputStream();
fileReader = new BufferedReader(new InputStreamReader(inputStream));
while ((line = fileReader.readLine()) != null) {
buffer.append(line);
}
} catch (Exception e) {
System.out.println(e);
} finally {
if (fileReader != null) {
try {
fileReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
//替换html模板中的参数
return MessageFormat.format(buffer.toString(), title);
}
}
编写发送邮件的控制器
import com.example.emailsendcodetest.entity.CodeEntity;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.mail.MailException;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.util.Arrays;
import java.util.Map;
import java.util.Random;
@RestController
@RequestMapping("email")
public class EmailController {
@Resource
private JavaMailSender javaMailSender;
//读取yml文件中username的值并赋值给form
@Value("${spring.mail.username}")
private String from;
@RequestMapping("sendEmail")
public CodeEntity sendSimpleMail(@RequestParam(value = "emailReceiver") String emailReceiver) throws MessagingException {
EmailEngine emailEngine = new EmailEngine();
// 构建一个邮件对象
// SimpleMailMessage message = new SimpleMailMessage();
MimeMessage message = javaMailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true);
//返回给前端的code-json module
CodeEntity codeEntity = new CodeEntity();
// 设置邮件发送者
helper.setFrom(from);
// 设置邮件接收者
helper.setTo(emailReceiver);
// 设置邮件的主题
helper.setSubject("注册验证码");
// 设置邮件的正文
Random random = new Random();
StringBuilder code = new StringBuilder();
for (int i = 0; i < 6; i++) {
int r = random.nextInt(10);
code.append(r);
}
String text = emailEngine.buildContent(code.toString());
helper.setText(text,true);
// 发送邮件
try {
javaMailSender.send(message);
codeEntity.setEmail(Arrays.toString(message.getFrom()));
codeEntity.setCode(code.toString());
codeEntity.setMsg("success");
return codeEntity;
} catch (MailException e) {
e.printStackTrace();
}
codeEntity.setEmail(Arrays.toString(message.getFrom()));
codeEntity.setCode("null");
codeEntity.setMsg("fail");
return codeEntity;
}
项目结构如图
接口测试
http://localhost/email/sendEmail?emailReceiver=879XXXX23@qq.com
这样做可以让前端获取数据做校验
用户接收到的的验证码邮件为html格式:
至此,web开发中的验证码模块开发完成。
你想拥有你从未拥有过的东西,就得去做你从未做过的事,加油