1,导入需要的包

        <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>

2,添加配置

添加配置前先要到邮箱设置里开启SMTP服务

application.yml

spring:
mail:
host: smtp.qq.com
username: xxxxxxx@qq.com #发送邮件人的邮箱
password: xxxxx #这个密码是邮箱设置里SMTP服务生成的授权码
default-encoding: UTF-8

3,编写发送邮箱的类

 接收类MailDO.java

package com.bootdo.oa.domain;

import java.util.Map;

/**
* 邮件接收参数
*/ public class MailDO { //标题
private String title;
//内容
private String content;
//接收人邮件地址
private String email;
//附加,value 文件的绝对地址/动态模板数据
private Map<String, Object> attachment; public String getTitle() {
return title;
} public void setTitle(String title) {
this.title = title;
} public String getContent() {
return content;
} public void setContent(String content) {
this.content = content;
} public String getEmail() {
return email;
} public void setEmail(String email) {
this.email = email;
} public Map<String, Object> getAttachment() {
return attachment;
} public void setAttachment(Map<String, Object> attachment) {
this.attachment = attachment;
}
}

MailService.java

package com.bootdo.oa.service;

import com.bootdo.oa.domain.MailDO;

public interface MailService {

    void sendTextMail(MailDO mailDO);

    void sendHtmlMail(MailDO mailDO,boolean isShowHtml);

    void sendTemplateMail(MailDO mailDO);
}

MailServiceImpl.java

package com.bootdo.oa.service.impl;

import com.bootdo.common.exception.SystemException;
import com.bootdo.oa.domain.MailDO;
import com.bootdo.oa.service.MailService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.FileSystemResource;
import org.springframework.mail.MailException;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context; import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.io.File; /**
* 发送邮件
*/
@Service
public class MailServiceImpl implements MailService { private final static Logger log = LoggerFactory.getLogger(MailServiceImpl.class); //template模板引擎
@Autowired
private TemplateEngine templateEngine; @Autowired
private JavaMailSender javaMailSender; @Value("${spring.mail.username}")
private String from; /**
* 纯文本邮件
* @param mail
*/
@Async //不解释不懂自行百度,友情提示:有坑
@Override
public void sendTextMail(MailDO mail){
//建立邮件消息
SimpleMailMessage message = new SimpleMailMessage();
message.setFrom(from); // 发送人的邮箱
message.setSubject(mail.getTitle()); //标题
message.setTo(mail.getEmail()); //发给谁 对方邮箱
message.setText(mail.getContent()); //内容
try {
javaMailSender.send(message); //发送
} catch (MailException e) {
log.error("纯文本邮件发送失败->message:{}",e.getMessage());
throw new SystemException("邮件发送失败");
}
} /**
* 发送的邮件是富文本(附件,图片,html等)
* @param mailDO
* @param isShowHtml 是否解析html
*/
@Async
@Override
public void sendHtmlMail(MailDO mailDO, boolean isShowHtml) {
try {
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
//是否发送的邮件是富文本(附件,图片,html等)
MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage,true);
messageHelper.setFrom(from);// 发送人的邮箱
messageHelper.setTo(mailDO.getEmail());//发给谁 对方邮箱
messageHelper.setSubject(mailDO.getTitle());//标题
messageHelper.setText(mailDO.getContent(),isShowHtml);//false,显示原始html代码,无效果
//判断是否有附加图片等
if(mailDO.getAttachment() != null && mailDO.getAttachment().size() > 0){
mailDO.getAttachment().entrySet().stream().forEach(entrySet -> {
try {
File file = new File(String.valueOf(entrySet.getValue()));
if(file.exists()){
messageHelper.addAttachment(entrySet.getKey(), new FileSystemResource(file));
}
} catch (MessagingException e) {
log.error("附件发送失败->message:{}",e.getMessage());
throw new SystemException("附件发送失败");
}
});
}
//发送
javaMailSender.send(mimeMessage);
} catch (MessagingException e) {
log.error("富文本邮件发送失败->message:{}",e.getMessage());
throw new SystemException("邮件发送失败");
}
} /**
* 发送模板邮件 使用thymeleaf模板
* 若果使用freemarker模板
* Configuration configuration = new Configuration(Configuration.VERSION_2_3_28);
* configuration.setClassForTemplateLoading(this.getClass(), "/templates");
* String emailContent = FreeMarkerTemplateUtils.processTemplateIntoString(configuration.getTemplate("mail.ftl"), params);
* @param mailDO
*/
@Async
@Override
public void sendTemplateMail(MailDO mailDO) {
try {
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage,true);
messageHelper.setFrom(from);// 发送人的邮箱
messageHelper.setTo(mailDO.getEmail());//发给谁 对方邮箱
messageHelper.setSubject(mailDO.getTitle()); //标题
//使用模板thymeleaf
//Context是导这个包import org.thymeleaf.context.Context;
Context context = new Context();
//定义模板数据
context.setVariables(mailDO.getAttachment());
//获取thymeleaf的html模板
String emailContent = templateEngine.process("/mail/mail",context); //指定模板路径
messageHelper.setText(emailContent,true);
//发送邮件
javaMailSender.send(mimeMessage);
} catch (MessagingException e) {
log.error("模板邮件发送失败->message:{}",e.getMessage());
throw new SystemException("邮件发送失败");
}
}
}

差点忘了还有个模板 mail.html

放在templates/mail目录下

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>title</title>
</head>
<body>
<h3>你看我<span style="font-size: 35px" th:text="${username}"></span>, 哈哈哈!</h3>
</body>
</html>

4,测试

单元测试启动太慢了,直接写controller测试

   @GetMapping("/testMail")
public R mail(MailDO mailDO){
try {
mailService.sendTextMail(mailDO);
} catch (Exception e) {
return R.error(e.getMessage());
}
return R.ok();
} @GetMapping("/htmlMail")
public R mail(MailDO mailDO){
try {
Map<String,Object> map = new HashMap<>();
map.put("附件名","附件的绝对路径");
mailDO.setAttachment(map);
mailService.sendHtmlMail(mailDO,false);
} catch (Exception e) {
return R.error(e.getMessage());
}
return R.ok();
}    @GetMapping("/templateMail")
public R mail(MailDO mailDO){
try {
Map<String,Object> map = new HashMap<>();
map.put("username","我变大了");
mailDO.setAttachment(map);
mailService.sendTemplateMail(mailDO);
} catch (Exception e) {
return R.error(e.getMessage());
}
return R.ok();
}

5,测试结果

收工。

最简单的 springboot 发送邮件,使用thymeleaf模板的更多相关文章

  1. 7 — 简单了解springboot中的thymeleaf

    1.官网学习地址 https://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf.html 2.什么是thymeleaf? 一张图看明白: 解读: ...

  2. 记录一次简单的springboot发送邮件功能

    场景:经常在我们系统中有通过邮件功能找回密码,或者发送生日祝福等功能,今天记录下springboot发送邮件的简单功能 1.引入maven <!-- 邮件开发--><dependen ...

  3. 解决SpringBoot项目中Thymeleaf模板的中文乱码问题

    1.使用IDEA创建SpringBoot项目 package com.example.demo; import org.springframework.boot.SpringApplication; ...

  4. SpringBoot中使用Thymeleaf模板

    1.引入pom依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId& ...

  5. SpringBoot 之Thymeleaf模板.

    一.前言 Thymeleaf 的出现是为了取代 JSP,虽然 JSP 存在了很长时间,并在 Java Web 开发中无处不在,但是它也存在一些缺陷: 1.JSP 最明显的问题在于它看起来像HTML或X ...

  6. Spring Boot2(五):使用Spring Boot结合Thymeleaf模板引擎使用总结

    一.Thymeleaf概述 一般来说,常用的模板引擎有JSP.Velocity.Freemarker.Thymeleaf . SpringBoot推荐的 Thymeleaf – 语法更简单,功能更强大 ...

  7. Thymeleaf模板引擎的使用

    Thymeleaf模板引擎的使用 1.模板引擎 JSP.Velocity.Freemarker.Thymeleaf 2.springboot推荐使用Thymeleaf模板引擎 特点:语法更简单,功能更 ...

  8. (二)springboot整合thymeleaf模板

    在我们平时的开发中,用了很久的jsp作view显示层,但是标签库和JSP缺乏良好格式的一个副作用就是它很少能够与其产生的HTML类似.所以,在Web浏览器或HTML编辑器中查看未经渲染的JSP模板是非 ...

  9. SpringBoot系列——Thymeleaf模板

    前言 thymeleaf是springboot官方推荐使用的java模板引擎,在springboot的参考指南里的第28.1.10 Template Engines中介绍并推荐使用thymeleaf, ...

随机推荐

  1. 【代码笔记】Web-CSS-CSS id和Class选择器

    一,效果图. 二,代码. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...

  2. Javascript异步编程之一异步原理

    本系列的例子主要针对node.js环境,但浏览器端的原理应该也是类似的. 本人也是Javascript新手,把自己这段时间学习积累的要点总结下来,希望可以对同样在学习Javascript/node.j ...

  3. vmware 开启VM的硬件cpu虚拟化功能

    物理机的cpu硬件虚拟化功能,通过开启bios中的设置,而vmware中创建的虚拟机也可以开启该特性,如下. 这样的话,就直接可以基于这些VM安装openstack计算节点.控制节点.网络节点了.

  4. Easyui 修改jquery validatebox为英文校验提示为中文提示

    修改jquery validatebox为英文校验提示为中文提示 by:授客 QQ:1033553122 测试环境 jquery-easyui-1.5.3 问题描述: 如图,想把校验提示由英文改成中文 ...

  5. C#判断远程计算机的指定端口是否打开的代码

    如下的内容段是关于C#判断远程计算机的指定端口是否打开的内容,应该能对小伙伴有一些用. using System.Net;if(!string.IsNullOrEmpty(txtPort.Text)) ...

  6. Android开发中如何使用RecyclerView

    介绍 在Android应用程序中,只要您想显示数据列表,就可以使用 RecyclerView . 早期的Android提供 ListView 了同样的东西. RecyclerView 可以被认为是一个 ...

  7. 理解java的三种代理模式

    代理模式是什么 代理模式是一种设计模式,简单说即是在不改变源码的情况下,实现对目标对象的功能扩展. 比如有个歌手对象叫Singer,这个对象有一个唱歌方法叫sing(). 1 public class ...

  8. MongoDB MapReduce用法简介

    Map-Reduce部分:Map-Reduce相当于关系型数据库中的group by,主要用于统计数据之用.MongoDB提供的Map-Reduce非常灵活,对于大规模数据分析也相当实用. 语法 db ...

  9. VS2017 EF本地数据库链接

    1. 本地数据库连接 server name可以从链接字符串中取: (localdb)\MSSQLLocalDB 注意少写一个\. { "Logging": { "Inc ...

  10. python 实例四

    https://www.cnblogs.com/evablogs/p/6754981.html 题目:输入某年某月某日,判断这一天是这一年的第几天? 程序分析: 月份天数: 月份 天数 2 平年28天 ...