一、准备
目前国内大部分的邮件服务商都不允许直接使用用户名/密码的方式来在代码中发送邮件,都是要先申请授权码,这里以 QQ 邮箱为例,向大家演示授权码的申请流程:首先我们需要先登录 QQ 邮箱网页版,点击上方的设置按钮:
然后点击账户选项卡,在账户选项卡中找到开启POP3/SMTP选项,点击开启,开启相关功能,开启过程需要手机号码验证,按照步骤操作即可,不赘述。开启成功之后,即可获取一个授权码
二、使用步骤
1.导入依赖
<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>
2.在ymal配置文件中写入配置
代码如下(示例):
spring:
mail:
username: 749888745@qq.com
password: pcuvzfecwkozbbdh
host: smtp.qq.com
配置参数含义:
username:邮箱名称
password:第一步申请到的授权码
host:SMTP 服务器地址
3.ftl模板
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style type="text/css">
html {
font-family: sans-serif;
-ms-text-size-adjust: 100%;
-webkit-text-size-adjust: 100%;
}
body {
margin: 10px;
}
table {
border-collapse: collapse;
border-spacing: 0;
}
td, th {
padding: 0;
word-break: break-all;
}
.pure-table {
border-collapse: collapse;
border-spacing: 0;
empty-cells: show;
border: 1px solid #cbcbcb;
}
.pure-table caption {
color: #000;
font: italic 85%/1 arial, sans-serif;
padding: 1em 0;
text-align: center;
}
.pure-table td, .pure-table th {
border-left: 1px solid #cbcbcb;
border-width: 0 0 0 1px;
font-size: inherit;
margin: 0;
overflow: visible;
padding: .5em 1em;
}
.pure-table thead {
background-color: #40a0cc;
color: #000;
text-align: center;
vertical-align: bottom;
}
.pure-table td {
background-color: transparent;
}
.pure-table-bordered td {
border-bottom: 1px solid #cbcbcb;
}
.pure-table-bordered tbody > tr:last-child > td {
border-bottom-width: 0;
}
</style>
</head>
<body>
<p>你好!</p>
<p>你已经成功订阅如下信息,若信息发生变更时会及时通知您~</p>
<#if scheduleType==1>
<table class="pure-table pure-table-bordered">
<thead>
<tr>
<td>排期ID</td>
<td>排期名称</td>
<td>当前节点</td>
<td>节目日期</td>
<td>节目开始时间</td>
<td>节目结束时间</td>
<td>授权产品</td>
<td>授权地区</td>
<td>水印</td>
<td>合作方</td>
<td>主路接入方式</td>
<td>主路信源地址</td>
<td>备路接入方式</td>
<td>备路信源地址</td>
<td>收费策略</td>
</tr>
</thead>
<#list schedules as schedule>
<tr>
<td><#if (schedule.id)??>${schedule.id}<#else>${(schedule.id)!}</#if></td>
<td><#if (schedule.scheduleName)??>${schedule.scheduleName}<#else>${(schedule.scheduleName)!}</#if></td>
<td><#if (schedule.scheduleNode)??>${schedule.scheduleNode}<#else>${(schedule.scheduleNode)!}</#if></td>
<td><#if (schedule.playingDate)??>${schedule.playingDate}<#else>${(schedule.playingDate)!}</#if></td>
<td><#if (schedule.liveStartTime)??>${schedule.liveStartTime}<#else>${(schedule.liveStartTime)!}</#if></td>
<td><#if (schedule.liveEndTime)??>${schedule.liveEndTime}<#else>${(schedule.liveEndTime)!}</#if></td>
<td><#if (schedule.authProduct)??>${schedule.authProduct}<#else>${(schedule.authProduct)!}</#if></td>
<td><#if (schedule.authArea)??>${schedule.authArea}<#else>${(schedule.authArea)!}</#if></td>
<td><#if (schedule.waterMarker)??>${schedule.waterMarker}<#else>${(schedule.waterMarker)!}</#if></td>
<td><#if (schedule.collaborator)??>${schedule.collaborator}<#else>${(schedule.collaborator)!}</#if></td>
<td><#if (schedule.mainUrlType)??>${schedule.mainUrlType}<#else>${(schedule.mainUrlType)!}</#if></td>
<td><#if (schedule.mainUrl)??>${schedule.mainUrl}<#else>${(schedule.mainUrl)!}</#if></td>
<td><#if (schedule.backupUrlType)??>${schedule.backupUrlType}<#else>${(schedule.backupUrlType)!}</#if></td>
<td><#if (schedule.backupUrl)??>${schedule.backupUrl}<#else>${(schedule.backupUrl)!}</#if></td>
<td><#if (schedule.chargeStrategy)??>${schedule.chargeStrategy}<#else>${(schedule.chargeStrategy)!}</#if></td>
</tr>
</#list>
</table>
<#else>
<table class="pure-table pure-table-bordered">
<thead>
<tr>
<td>排期ID</td>
<td>排期名称</td>
<td>当前节点</td>
<td>节目日期</td>
<td>节目开始时间</td>
<td>比赛时间</td>
<td>节目结束时间</td>
<td>赛事</td>
<td>轮次/项目</td>
<td>演播室</td>
<td>解说/嘉宾</td>
<td>收费策略</td>
</tr>
</thead>
<#list schedules as schedule>
<tr>
<td><#if (schedule.id)??>${schedule.id}<#else>${(schedule.id)!}</#if></td>
<td><#if (schedule.scheduleName)??>${schedule.scheduleName}<#else>${(schedule.scheduleName)!}</#if></td>
<td><#if (schedule.scheduleNode)??>${schedule.scheduleNode}<#else>${(schedule.scheduleNode)!}</#if></td>
<td><#if (schedule.playingDate)??>${schedule.playingDate}<#else>${(schedule.playingDate)!}</#if></td>
<td><#if (schedule.liveStartTime)??>${schedule.liveStartTime}<#else>${(schedule.liveStartTime)!}</#if></td>
<td><#if (schedule.playingTime)??>${schedule.playingTime}<#else>${(schedule.playingTime)!}</#if></td>
<td><#if (schedule.liveEndTime)??>${schedule.liveEndTime}<#else>${(schedule.liveEndTime)!}</#if></td>
<td><#if (schedule.liveBusiness)??>${schedule.liveBusiness}<#else>${(schedule.liveBusiness)!}</#if></td>
<td><#if (schedule.round)??>${schedule.round}<#else>${(schedule.round)!}</#if></td>
<td><#if (schedule.studio)??>${schedule.studio}<#else>${(schedule.studio)!}</#if></td>
<td><#if (schedule.narrator)??>${schedule.narrator}<#else>${(schedule.narrator)!}</#if></td>
<td><#if (schedule.chargeStrategy)??>${schedule.chargeStrategy}<#else>${(schedule.chargeStrategy)!}</#if></td>
</tr>
</#list>
</table>
</#if>
<br>
<p>- - - - - - - - - - - - - - - - - - - - - -</p>
<b>订阅通知</b>
</body>
</html>
4.发送邮件方法
public void sendMail(List<ScheduleInfo> scheduleInfos, String emails, Integer emailType, Integer node, JavaMailSender javaMailSender) {
try {
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
//发件人,邮箱地址,别名
helper.setFrom("[email protected]", "小王");
helper.setTo(emails.split(","));
helper.setSentDate(new Date());
//构建 Freemarker 的基本配置
// 配置模板位置
Map<String, Object> map = new HashMap<>();
//此处的scheduleTemplateVos对应模板中的集合参数
map.put("schedules", scheduleTemplateVos);
map.put("node", node);
Configuration configuration = new Configuration(Configuration.VERSION_2_3_28);
configuration.setClassForTemplateLoading(this.getClass(), "/static");
//设置参数不让数值化
configuration.setNumberFormat("#");
String ftl;
String subject;
switch (emailType) {
case 1:
ftl = "subscribe.ftl";
//主题
subject = "订阅成功通知";
break;
case 2:
ftl = "change.ftl";
subject = "订阅信息变更通知";
break;
case 3:
ftl = "nodeflow.ftl";
subject = "节点流转通知";
break;
default:
ftl = "";
subject = "";
break;
}
String emailContent = FreeMarkerTemplateUtils.processTemplateIntoString(configuration.getTemplate(ftl), map);
helper.setSubject(subject);
helper.setText(emailContent, true);
javaMailSender.send(mimeMessage);
} catch (Exception e) {
log.error("---------->error:{}", e.getMessage(), e);
}
}