- maven引入jar包
<!-- 邮箱验证-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
- 配置文件配置
spring:
mail:
default-encoding: utf-8
host: smtp.qq.com #使用qq邮箱验证
username: xxxxxxx@qq.com #本人邮箱测试
password: xxxxxxxxxxxxxxxxx#本人邮箱密匙
application.properties
配置
spring.mail.properties.mail.smtp.ssl.enable=true
spring.mail.properties.mail.smtp.timeout=10000
spring.mail.properties.mail.smtp.connectiontimeout=10000
spring.mail.properties.mail.smtp.writetimeout=10000
- 模板配置
截图如下所示:
其中 标题,用户名,验证码 ,类型都可以自定义。
包括模板都可以自定义 参考如下
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
<meta charset="utf-8" />
</head>
<body>
<div class="qmbox qm_con_body_content qqmail_webmail_only" id="mailContentContainer" style="">
<style type="text/css">
.qmbox body {
margin: 0;
padding: 0;
background: #fff;
font-family: "Verdana, Arial, Helvetica, sans-serif";
font-size: 14px;
line-height: 24px;
}
.qmbox div, .qmbox p, .qmbox span, .qmbox img {
margin: 0;
padding: 0;
}
.qmbox img {
border: none;
}
.qmbox .contaner {
margin: 0 auto;
}
.qmbox .title {
margin: 0 auto;
background: url() #CCC repeat-x;
height: 30px;
text-align: center;
font-weight: bold;
padding-top: 12px;
font-size: 16px;
}
.qmbox .content {
margin: 4px;
}
.qmbox .biaoti {
padding: 6px;
color: #000;
}
.qmbox .xtop, .qmbox .xbottom {
display: block;
font-size: 1px;
}
.qmbox .xb1, .qmbox .xb2, .qmbox .xb3, .qmbox .xb4 {
display: block;
overflow: hidden;
}
.qmbox .xb1, .qmbox .xb2, .qmbox .xb3 {
height: 1px;
}
.qmbox .xb2, .qmbox .xb3, .qmbox .xb4 {
border-left: 1px solid #BCBCBC;
border-right: 1px solid #BCBCBC;
}
.qmbox .xb1 {
margin: 0 5px;
background: #BCBCBC;
}
.qmbox .xb2 {
margin: 0 3px;
border-width: 0 2px;
}
.qmbox .xb3 {
margin: 0 2px;
}
.qmbox .xb4 {
height: 2px;
margin: 0 1px;
}
.qmbox .xboxcontent {
display: block;
border: 0 solid #BCBCBC;
border-width: 0 1px;
}
.qmbox .line {
margin-top: 6px;
border-top: 1px dashed #B9B9B9;
padding: 4px;
}
.qmbox .neirong {
padding: 6px;
color: #666666;
}
.qmbox .foot {
padding: 6px;
color: #777;
}
.qmbox .font_darkblue {
color: #006699;
font-weight: bold;
}
.qmbox .font_lightblue {
color: #008BD1;
font-weight: bold;
}
.qmbox .font_gray {
color: #888;
font-size: 12px;
}
</style>
<div class="contaner">
<div class="title">$(title)</div>
<div class="content">
<p class="biaoti"><b>亲爱的用户,你好!</b></p>
<b class="xtop"><b class="xb1"></b><b class="xb2"></b><b class="xb3"></b><b class="xb4"></b></b>
<div class="xboxcontent">
<div class="neirong">
<p><b>请核对你的用户名:</b><span id="userName" class="font_darkblue">$(userName)</span></p>
<p><b>$(type)的验证码:</b><span class="font_lightblue"><span id="yzm" data="$(captcha)" onclick="return false;" t="7" style="border-bottom: 1px dashed rgb(204, 204, 204); z-index: 1; position: static;">$(captcha)</span></span><br><span class="font_gray">(请输入该验证码完成$(type),验证码5分钟内有效!)</span></p>
<div class="line">如果你未申请$(type)服务,请忽略该邮件。</div>
</div>
</div>
<b class="xbottom"><b class="xb4"></b><b class="xb3"></b><b class="xb2"></b><b class="xb1"></b></b>
</div>
</div>
<style type="text/css">
.qmbox style, .qmbox script, .qmbox head, .qmbox link, .qmbox meta {
display: none !important;
}
</style>
</div>
</body>
</html>
- 实现思路:
由于邮件发送的内容可以解析为html样式,但是如果使用后台拼接的方式进行发送,未免有些不太合适, 我们可以通过文件流的方式解析模板为字符串, 对于一些特定字段进行替换, 如 $(userName) $(title) 进行替换,这样就可以动态发送页面了。
1.1 解析模板为字符串
在一些启动注入类的方法中,如自定义模板配置,shiro 配置中 Bean包含的方法执行 initEmailTemplate();
方法
/public/email/emailTemplate.html
为自定义模板相对路径
private void initEmailTemplate() {
StringBuilder sb = new StringBuilder();
try {
String encoding = "UTF-8";
InputStream resourceAsStream = this.getClass().getResourceAsStream("/public/email/emailTemplate.html");
// 考虑到编码格式
InputStreamReader read = new InputStreamReader(
resourceAsStream, encoding);
BufferedReader bufferedReader = new BufferedReader(read);
String lineTxt = null;
while ((lineTxt = bufferedReader.readLine()) != null) {
sb.append(lineTxt);
}
System.setProperty("emailTemplate", sb.toString());
System.out.println("注入文件:"+sb.toString());
resourceAsStream.close();
read.close();
} catch (IOException e) {
System.out.println("读取文件内容出错");
e.printStackTrace();
}
}
获取字符串方法为: System.getProperty("emailTemplate");
1.2 模板参数填补
对于以下自定义参数进行替换,请注意字符不要冲突
/**
* @author mgy
* @version 1.0
* @date 2020/4/20
* 发送模板
*/
@Component
public class EmailTemplate {
/**
* @param title 标题
* @param userName 用户名
* @param type 类型 【邮箱验证】
* @param captcha 【验证码】
* @return
*/
public String getHtml(String title, String userName, String type, String captcha) {
String emailTemplet = System.getProperty("emailTemplate");
emailTemplet = emailTemplet.replace("$(title)", title);
emailTemplet = emailTemplet.replace("$(userName)", userName);
emailTemplet = emailTemplet.replace("$(type)", type);
emailTemplet = emailTemplet.replace("$(captcha)", captcha);
return emailTemplet;
}
}
- 异步发送接口
创建EmailServiceImpl
接口
注入我们创建的方法和发信人
@Value("${spring.mail.username}")
private String form;
@Autowired
private JavaMailSender mailSender;
@Autowired
private EmailTemplate emailTemplate;
异步发送方法
/**
* @param params 接收人邮箱
* @param title 标题
* @param code 验证码
* @param username 用户名
*/
@Async
@Override
public void sendEmail(String params,String title,String code,String username) {
MimeMessage message = mailSender.createMimeMessage();
try{
//true表示需要创建一个multipart message
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(form);
helper.setTo(params);//邮件接收者
helper.setSubject(title);//邮件主题
String email = emailTemplate.getHtml(title, username, "邮箱绑定", code);
helper.setText(email,true);//邮件内容
mailSender.send(message);
logger.debug(params + "发送成功。");
}catch (MessagingException messagingException){
logger.error("发送失败!发送人:{}",params);
}
}
目前测试163.com, QQ邮箱