SpringBoot使用FreeMarker模板发送邮件
作者:if_where 发布时间:2021-07-27 07:32:26
标签:SpringBoot,FreeMarker,发送邮件
本文实例为大家分享了SpringBoot +Mail+FreeMarker发送邮件,供大家参考,具体内容如下
通过spirngboot 自带的mail服务及FreeMarker模板引擎,发送邮
添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--消除冗余代码使用-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
在application.yml文件中配置Mail信息
spring:
mail:
port: 25
username: ${username}
password: ${password}
protocol: smtp
default-encoding: utf-8
host: ${host}
编写MailService服务
@Service
public class MailServiceImpl implements MailService {
//邮件的发送者
@Value("${spring.mail.username}")
private String from;
//注入MailSender
@Autowired
private JavaMailSender mailSender;
//发送邮件的模板引擎
@Autowired
private FreeMarkerConfigurer configurer;
/**
* @param params 发送邮件的主题对象 object
* @param title 邮件标题
* @param templateName 模板名称
*/
@Override
public void sendMessageMail(Object params, String title, String templateName) {
try {
MimeMessage mimeMessage = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
helper.setFrom(from);
helper.setTo(InternetAddress.parse("xxxxx@163.com"));//发送给谁
helper.setSubject("【" + title + "-" + LocalDate.now() + " " + LocalTime.now().withNano(0) + "】");//邮件标题
Map<String, Object> model = new HashMap<>();
model.put("params", params);
try {
Template template = configurer.getConfiguration().getTemplate(templateName);
try {
String text = FreeMarkerTemplateUtils.processTemplateIntoString(template, model);
helper.setText(text, true);
mailSender.send(mimeMessage);
} catch (TemplateException e) {
e.printStackTrace();
}
} catch (IOException e) {
e.printStackTrace();
}
} catch (MessagingException e) {
e.printStackTrace();
}
}
}
定义发送邮件对象
发送内容为object,我这里演示一个对象,通过模板渲染方式接收内容
@Data
public class Message {
private String messageCode;
private String messageStatus;
private String cause;
}
在项目templates目录新建个message.ftl文件
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>消息通知</title>
</head>
<style type="text/css">
table {
font-family: "Trebuchet MS", Arial, Helvetica, sans-serif;
width: 100%;
border-collapse: collapse;
}
td, th {
font-size: 1em;
border: 1px solid #5B4A42;
padding: 3px 7px 2px 7px;
}
th {
font-size: 1.1em;
text-align: center;
padding-top: 5px;
padding-bottom: 4px;
background-color: #24A9E1;
color: #ffffff;
}
</style>
<body>
<div>
<h2>邮件消息通知</h2>
<table id="customers">
<tr>
<th>MessageCode</th>
<th>MessageStatus</th>
<th>Cause</th>
</tr>
<tr>
<td>${(params.messageCode)!""}</td>
<td>${(params.messageStatus)!""}</td>
<td>${(params.cause)!""}</td>
</tr>
</table>
</div>
</body>
</html>
测试邮件发送
新建controller类
@RestController
public class MailController {
@Autowired
private MailService mailService;
@RequestMapping(value = "/sendMessage", method = RequestMethod.GET)
public void sendMailMessage() {
Message message = new Message();
message.setMessageCode("MissingParameter");
message.setMessageStatus("Failed");
message.setCause("缺少参数,请确认");
mailService.sendMessageMail(message, "测试消息通知", "message.ftl");
}
}
启动服务访问 http://localhost:8080/sendMessage
查看邮箱
源码地址
来源:https://blog.csdn.net/system_linux/article/details/78792028


猜你喜欢
- 通过一个变量控制线程中断代码:package com.itsoku.chat05;import java.util.concurrent.T
- 1、xml代码:<?xml version="1.0" encoding="utf-8"?&g
- 一、Thread 的常见构造方法方法说明Thread()创建线程对象Thread(Runnable target)使用 Runnable 对
- 前言 红包文化源远流长。从古时的红色纸包,到手
- RestTemplate 401错误调用第三方api 若是服务返回状态码不为200,默认会执行DefaultResponseErrorHan
- 背景介绍1,最近有一个大数据量插入的操作入库的业务场景,需要先做一些其他修改操作,然后在执行插入操作,由于插入数据可能会很多,用到多线程去拆
- 首先,通过一张最新(2021.11)的编程语言排名图来了解常见的编程语言:从图中可以看出,C++的排名相对于Python、Java、C来说并
- 即刻点赞展示点赞的数字增加和减少并不是整个替换,而是差异化替换。再加上动画效果就看的很舒服。自己如何实现这种数字切换呢?下面用一张图来展示我
- 1.生成自己的注解(为了确定在哪些位置使用)/** * 关闭patch delete的model处理,否则会报错 */@Target({El
- 在WinForm程序中,实现TextBox文本输入框占位符的方式也很多,最常用的是方式基于Windows Api SendMessage函数
- cpu是时分(time division)的,操作系统里有很多线程,每个线程的运行时间由cpu决定,cpu会分给每个线程一个时间片,时间片是
- 首先我们要明白一下几点,1.代码写出来除了让他跑起来还有个非常非常重要的作用是维护,因为没有一成不变的代码,需求变化代码就不可避免的要变化。
- C#中WPF ListView绑定数据的实例详解WPF中ListView用来显示数据十分方便, 我们可以将它分成几个列,每一个列用来显示一条
- Springboot整合RockerMQ1、maven依赖<dependencies> <!--
- 本文实例为大家分享了Unity3D选择本地图片并加载的具体代码,供大家参考,具体内容如下①找到System.Windows.Forms.dl
- 本文实例讲述了C#实现获取程序路径方法。分享给大家供大家参考。具体如下:获取DLL的目录:Assembly myAssembly = Ass
- 1. 概述本文主要包括以下几个方面:编码基本知识,Java,系统软件,url,工具软件等。在下面的描述中,将以"中文"两
- 本文实例讲述了Java实现的求解经典罗马数字和阿拉伯数字相互转换问题。分享给大家供大家参考,具体如下:古罗马帝国开创了辉煌的人类文明,但他们
- 首先给大家声明一点:需要 jdk 7 , tomcat需要支持websocket的版本 1.InitServlet &n
- 最近项目里涉及到自定义View的东西还是挺多的,所以打算在自定义View上多花点时间,也顺便分享给大家。先总结下自定义View的步骤:1、自