引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
实体类
@Data
public class EmailBean implements Serializable {
private String[] receiver;
private String subject;
private String count;
}
邮件发送工具类
@Component
public class EmailUtil {
@Value("${spring.mail.username}")
private String sender;
@Autowired
JavaMailSender javaMailSender;
//纯文本
public void sendPlainTextMail(EmailBean emailBean){
SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
simpleMailMessage.setFrom(sender);
simpleMailMessage.setTo(emailBean.getReceiver());
simpleMailMessage.setSubject(emailBean.getSubject());
simpleMailMessage.setText(emailBean.getCount());
javaMailSender.send(simpleMailMessage);
}
//模板发送
public void sendMimeMail(EmailBean emailBean) throws Exception {
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true);
mimeMessageHelper.setFrom(sender);
mimeMessageHelper.setTo(emailBean.getReceiver());
mimeMessageHelper.setSubject(emailBean.getSubject());
mimeMessageHelper.setText(emailBean.getCount(), true);
javaMailSender.send(mimeMessage);
}
}
thymeleaf 模板
模板放在 src/main/resources/templates 下 OneWeekAgain.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h2>活动KPI</h2>
<table cellpadding="10" cellspacing="1" style="width: 100%">
<tr style="background-color: #FE5E5E;color: #F0F8FF">
<th>活动产品总数</th>
<th>抽奖次数</th>
<th>抽奖率</th>
<th>抽奖人数</th>
<th>人均抽奖次数</th>
<th>奖品成功发放数量</th>
<th>奖品成功发放率</th>
<tr/>
<tr th:if="${#lists.isEmpty(kpi.prizeList)}" style="background-color: #FFF4F4;text-align: center">
<td colspan="7">对不起,该活动下未添加奖品!</td>
</tr>
<tr th:unless="${#lists.isEmpty(kpi.prizeList)}" th:object="${kpi}" style="background-color: #FFF4F4;text-align: center">
<td th:text="*{actPrizeNum}"></td>
<td th:text="*{outNum}"></td>
<td th:text="*{rate}"></td>
<td th:text="*{aveCount}"></td>
<td th:text="*{rateAve}"></td>
<td th:text="*{grantSuccess}"></td>
<td th:text="*{grantSuccessRate}"></td>
</tr>
</table>
<br />
<table cellpadding="10" cellspacing="1" style="width: 100%">
<tr style="background-color: #FE5E5E;color: #F0F8FF">
<th>活动预算费用</th>
<th>已抽奖金额</th>
<th>实际发放金额</th>
<th>费用消耗百分比</th>
<th>商户号余额</th>
<th>平均每日发放金额</th>
<tr/>
<tr th:if="${#lists.isEmpty(kpi.prizeList)}" style="background-color: #FFF4F4;text-align: center">
<td colspan="6">对不起,该活动下未添加奖品!</td>
</tr>
<tr th:unless="${#lists.isEmpty(kpi.prizeList)}" th:object="${kpi}" style="background-color: #FFF4F4;text-align: center">
<td th:text="*{money}"></td>
<td th:text="*{outMoney}"></td>
<td th:text="*{realityOutMoney}"></td>
<td th:text="*{moneyOutRate}"></td>
<td th:text="*{residueMoney}"></td>
<td th:text="*{moneyDayAvg}"></td>
</tr>
</table>
<h2>活动每周数据</h2>
<table cellpadding="10" cellspacing="1" style="width: 100%" >
<tr style="background-color: #FE5E5E;color: #F0F8FF">
<th colspan="2"></th>
<th colspan="2" th:each="item : ${oneWeekSource.successSource}" th:text="${item.name}"></th>
<th colspan="2" th:each="item : ${oneWeekSource.failSource}" th:text="${item.name}"></th>
<th colspan="4">合计数量</th>
<tr/>
<tr style="background-color: #FE5E5E;color: #F0F8FF;text-align: center">
<td>开始日</td>
<td>结束日</td>
<td th:each="item : ${oneWeekSource.oneWeekPrizeSource}" th:text="${item}"></td>
<td>数量(成功)</td>
<td>金额(成功)</td>
<td>数量(失败或未领取)</td>
<td>金额(失败或未领取)</td>
<tr/>
<tr th:if="${#lists.isEmpty(kpi.prizeList)}" style="background-color: #FFF4F4;text-align: center">
<td>对不起,该活动下未添加奖品!</td>
</tr>
<tr th:unless="${#lists.isEmpty(kpi.prizeList)}" th:object="${oneWeekSource}" style="background-color: #FFF4F4;text-align: center">
<td th:text="*{beginTime}"></td>
<td th:text="*{endTime}"></td>
<td th:each="item : *{successPrize}" th:text="${item}"></td>
<td th:each="item : *{failPrize}" th:text="${item}"></td>
<td th:text="*{oneWeekSuccessNum}"></td>
<td th:text="*{oneWeekSuccessMoney}"></td>
<td th:text="*{oneWeekFailNum}"></td>
<td th:text="*{oneWeekFailMoney}"></td>
</tr>
</table>
</body>
</html>
简单教程:http://t.csdnimg.cn/A3yCQ
中文文档:https://fanlychie.github.io/post/thymeleaf.html
官方文档:Documentation - Thymeleaf
邮箱发送
@Autowired
private TemplateEngine templateEngine;
@Autowired
private EmailUtil emailUtil;
public void oneTenantEmail(JSONObject jsonObject,JSONObject oneWeekSource,AgainConfig againConfig,LocalDate currentDate,LocalDate oneWeekAgo,Long id){
Context context = new Context();
//Thymeleaf模板中所用到的数据
context.setVariable("kpi",jsonObject);
context.setVariable("oneWeekSource",oneWeekSource);
//OneWeekAgain Thymeleaf模板文件名称
String emailContent = templateEngine.process("OneWeekAgain", context);
JSONObject ruleConfig = againConfig.getRuleConfig();
if (ruleConfig.getInteger("mail_status") == 1 && !StringUtils.isEmpty(ruleConfig.getString("mail"))) {
EmailBean emailBean = new EmailBean();
String email = ruleConfig.getString("mail");
String[] receiver = email.split("\\|");
if (isEmailValid(receiver)) {
//邮箱
emailBean.setReceiver(receiver);
//主题
emailBean.setSubject(againConfig.getActName()+"("+ oneWeekAgo+"至"+currentDate+")");
//内容
emailBean.setCount(emailContent);
try {
emailUtil.sendMimeMail(emailBean);
} catch (Exception e) {
e.printStackTrace();
}
logger.info("资金周数据邮件发送成功!");
} else {
logger.error("邮件发送失败!ID:{},活动名称:{},邮箱格式错误!",id,againConfig.getActName());
}
} else {
logger.error("邮件发送失败!ID:{},活动名称:{},没有配置邮箱!",id,againConfig.getActName());
}
}