springboot+thymeleaf实现发Html邮件自由

news/2024/5/4 1:44:20/文章来源:https://blog.csdn.net/sincool1003/article/details/130135552

2019年,我刚接触测试架构和测试开发类的工作时,经常会有自动化发邮件的功能,大都是从各个平台自动化统计一些数据出来,每周定时发一封邮件给领导交差,回过头来再看看我发的邮件,不美观,不专业。这2年,也有想过不要再费劲去拼样式+变量字符串了,但由于我打工仔繁忙的属性,一直拖到现在。这周项目有空闲时间,我研究了一下,弄了个模板出来,业务代码一套,就成了!!!!!

技术选型

springboot+thymeleaf

基础配置

配置

#application.properties
spring.mail.host=192.168.19.232    
spring.mail.username=bug@hookweb.com.cn   #发件人邮箱
spring.mail.password=emailqa              #发件人邮箱授权码,不是密码,如果有些企业邮箱本身不存在授权,直接用密码试试
spring.mail.protocol=smtp
spring.mail.default-encoding=UTF-8
spring.mail.port=25
spring.thymeleaf.prefix=classpath:/templates/

POM依赖

		<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><version>2.1.5.RELEASE</version></dependency>

HTML邮箱模板

最炫酷,最自由的方式,HTML模板任意定制,直接从网上下载最方便

<!DOCTYPE html>
<!--suppress ALL-->
<html xmlns:th="http://www.thymeleaf.org" xmlns:background-color="http://www.w3.org/1999/xhtml">
<head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="description" content="email code"><meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<!--邮箱验证码模板-->
<body>
<div style="background-color:#ECECEC; padding: 35px;"><table cellpadding="0" align="center"style="width: 800px;height: 100%; margin: 0px auto; text-align: left; position: relative; border-top-left-radius: 5px; border-top-right-radius: 5px; border-bottom-right-radius: 5px; border-bottom-left-radius: 5px; font-size: 14px; font-family:微软雅黑, 黑体; line-height: 1.5; box-shadow: rgb(153, 153, 153) 0px 0px 5px; border-collapse: collapse; background-position: initial initial; background-repeat: initial initial;background:#fff;"><tbody><tr><th valign="middle"style="height: 25px; line-height: 25px; padding: 15px 35px; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: RGB(148,0,211); background-color: RGB(148,0,211); border-top-left-radius: 5px; border-top-right-radius: 5px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px;"><font face="微软雅黑" size="5" style="color: rgb(255, 255, 255); " th:text="${content}">    <!--/*@thymesVar id="msg" type="java"*/--></font></th></tr><tr><td style="word-break:break-all"><div style="padding:25px 35px 40px; background-color:#fff;opacity:0.8;"><h2 style="margin: 5px 0px; "><font color="#333333" style="line-height: 20px; "><font style="line-height: 22px; " size="4">尊敬的用户:</font></font></h2><!-- 中文 --><p >您好!感谢您使用****,您的账号正在进行邮箱验证,验证码为:<font color="#ff8c00"><!--/*@thymesVar id="recipienttype" type="java"*/--><div th:object="${bodyEntity}"><p th:text="*{recipienttype}"></p><p th:text="*{address}"></p></div><p th:text="${code}"></p></font>,有效期30分钟,请尽快填写验证码完成验证!</p><br><div style="width:100%;margin:0 auto;"><div style="padding:10px 10px 0;border-top:1px solid #ccc;color:#747474;margin-bottom:20px;line-height:1.3em;font-size:12px;"><p>****团队</p><p>联系我们:********</p><br><p>此为系统邮件,请勿回复<br>Please do not reply to this system email</p><!--<p>©***</p>--></div></div></div></td></tr></tbody></table>
</div>
</body>
</html>

基础发邮件服务

package com.send.mail.services;
import java.util.Map;
public interface MailService {void sendHtmlMailOne(String to, String subject, String content);void sendHtmlMailMulti(String[] to, String subject, String content);
}

基础发邮件服务实现

package com.send.mail.services.impl;import com.send.mail.services.MailService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
@Service
public class MailServiceImpl implements MailService {@Value("${spring.mail.username}") //直接从配置文件获取username的值private String from;@Autowiredprivate JavaMailSender javaMailSender;@Overridepublic void sendHtmlMailOne(String to, String subject, String content) {try {MimeMessage message = javaMailSender.createMimeMessage();MimeMessageHelper helper = new MimeMessageHelper(message, true);helper.setTo(to);//收件者helper.setFrom(from);//发送者helper.setSubject(subject);//主题helper.setText(content, true);//第二个参数true表示邮件正文是HTML格式的,该参数不传默认为false。javaMailSender.send(message);} catch (MessagingException e) {System.out.println("发送失败");}}@Overridepublic void sendHtmlMailMulti(String[] to, String subject, String content) {try {MimeMessage message = javaMailSender.createMimeMessage();MimeMessageHelper helper = new MimeMessageHelper(message, true);helper.setTo(to);//收件者helper.setFrom(from);//发送者helper.setSubject(subject);//主题helper.setText(content, true);//第二个参数true表示邮件正文是HTML格式的,该参数不传默认为false。javaMailSender.send(message);}catch (Exception e) {e.printStackTrace();}}
}

使用JavaMailSender发送邮件
注入JavaMailSender(由Spring容器管理)
使用MimeMessageHelper消息助手,可自定义设置发件人、收件人、抄送人等邮件信息

动态值

变量值

package com.send.mail.util;
import org.springframework.stereotype.Service;
@Service
public class GetCode {public String getCode() {String str = "123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; // no zeroStringBuilder code = new StringBuilder();for (int i = 0; i < 6; i++) {int index = (int) (Math.random() * str.length());code.append(str.charAt(index));}return code.toString();}
}

对象传给HTML解析

package com.send.mail.util;
public class BodyEntity {private String recipienttype;private String address;public BodyEntity() {}public BodyEntity(String recipienttype, String address) {this.recipienttype = recipienttype;this.address = address;}public void setRecipienttype(String recipienttype) {this.recipienttype = recipienttype;}public void setAddress(String address) {this.address = address;}public String getRecipienttype() {return recipienttype;}public String getAddress() {return address;}
}

controller解析发送邮件

package com.send.mail.controller;
import com.send.mail.services.impl.MailServiceImpl;
import com.send.mail.util.BodyEntity;
import com.send.mail.util.GetCode;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;
import javax.mail.MessagingException;
import java.util.HashMap;
import java.util.Map;
@RestController
public class IndexController {@Autowiredprivate MailServiceImpl mailService;@Autowiredprivate TemplateEngine templateEngine;@Autowiredprivate GetCode getCode;@GetMapping("/sendmail/{to}")public String sendmail(@PathVariable String to) throws MessagingException {//Thymeleaf提供了TemplateEngine来对模板进行渲染,通过Context构造模板中变量需要的值Context context = new Context();context.setVariable("title", "自定义的HTML内容标题");//设置templates模板里的title变量值context.setVariable("content","自定义的HTML内容标题");String mail = templateEngine.process("index.html", context);mailService.sendHtmlMailOne(to, "邮件标题", mail);return "sucess";}@GetMapping("/sendmailm/{to}")public String sendmailm(@PathVariable String[] to) throws MessagingException {//Thymeleaf提供了TemplateEngine来对模板进行渲染,通过Context构造模板中变量需要的值BodyEntity bodyEntity=new BodyEntity();bodyEntity.setRecipienttype("recipient's");bodyEntity.setAddress("danae@hookweb.com.cn");Context context = new Context();context.setVariable("title", "自定义的HTML内容标题");//设置templates模板里的title变量值context.setVariable("content","自定义的HTML内容标题");context.setVariable("code",getCode.getCode());context.setVariable("bodyEntity",bodyEntity);String mail = templateEngine.process("index.html", context);mailService.sendHtmlMailMulti(to, "邮件标题", mail);return "sucess";}
}

接口请求

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_286028.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JUC并发编程之AQS原理

1. AQS 原理 1.1 概述 全称是 AbstractQueuedSynchronizer&#xff0c;是阻塞式锁和相关的同步器工具的框架 特点&#xff1a; 用 state 属性来表示资源的状态&#xff08;分独占模式和共享模式&#xff09;&#xff0c;子类需要定义如何维护这个生态&#xff0c;控制如何获…

医院不良事件报告系统源码:基于PHP+vue2+element+laravel8技术开发

医院不良事件报告系统源码 文末获取联系&#xff01; 技术架构&#xff1a;前后端分离&#xff0c;仓储模式&#xff0c; 开发语言&#xff1a;PHP 开发工具&#xff1a;vscode 前端框架&#xff1a;vue2element 后端框架&#xff1a;laravel8 数 据 库&#xff1a;mysql5…

Vue3 关于setup与自定义指令

setup语法糖 最大好处就是所有声明部分皆可直接使用&#xff0c;无需return出去 注意&#xff1a;部分功能还不完善&#xff0c;如&#xff1a;name、render还需要单独加入script标签按compositionAPI方式编写 // setup 下还可以附加<script> setup语法糖独有 &…

用SSH登陆Centos系统时,命令行最前面显示“的提示符[root@www myapp]”是什么意思?

用SSH登陆Centos系统时&#xff0c;命令行最前面显示“的提示符[rootwww myapp]”是什么意思&#xff1f; 在SSH登录到CentOS系统时&#xff0c;提示符 [rootwww myapp] 中的 www 表示当前登录的主机名&#xff08;hostname&#xff09;&#xff0c;也就是指当前运行的CentOS系…

《程序员面试金典(第6版)》面试题 10.03. 搜索旋转数组(二分法,分钟思想,入门题目)

题目描述 搜索旋转数组。给定一个排序后的数组&#xff0c;包含n个整数&#xff0c;但这个数组已被旋转过很多次了&#xff0c;次数不详。请编写代码找出数组中的某个元素&#xff0c;假设数组元素原先是按升序排列的。若有多个相同元素&#xff0c;返回索引值最小的一个。 示例…

4.12~(小组成员对话预习)

注意我们这里观察的是XP的kernel32.dll&#xff0c;到win10是有变化的 看了这个函数&#xff0c;似乎是让BasepExeLdrEntry不存在的时候初始化一遍&#xff0c;然后进行对比是否已经加载过这个dll&#xff0c;那么如果加载下一个dll的时候&#xff0c;BasepExeLdrEntry是不是还…

SM59 RFC 目标 SAP_PROXY_ESR 设置到服务资源库连接的检查列表

设置到服务资源库连接的检查列表 1. 企业服务资源库的地址必须在 SAP 系统中已知 检查报表 SPROX_CHECK_IFR_ADDRESS。2. 要连接到企业服务资源库&#xff0c;必须维护 RFC 目标 "SAP_PROXY_ESR"。此 RFC 目标将由代理生成 / 事务 SPROXY 使用。必须使用事务 SM59 进…

规模化敏捷框架:Scrum@Scale

Scrum 敏捷方法有助于团队成员之间更有效地合作&#xff0c;实现共同的业务目标。但是当一个组织想要扩展 Scrum 方法到更多的团队时&#xff0c;应该如何实施&#xff1f;Scrum 仅为单团队开发、交付和运维产品提供了一个框架&#xff0c;而 ScrumScale&#xff08;SS&#xf…

Ubuntu20.04 安装QGIS

qgis的git&#xff1a; GitHub - qgis/QGIS: QGIS is a free, open source, cross platform (lin/win/mac) geographical information system (GIS) qgis的官网:Welcome to the QGIS project! qgis插件包下载地址&#xff1a;https://plugins.qgis.org/plugins/ 1.Prerequisi…

【LeetCode每日一题: 1039. 多边形三角剖分的最低得分 | 暴力递归=>记忆化搜索=>动态规划 | 区间dp 】

&#x1f34e;作者简介&#xff1a;硕风和炜&#xff0c;CSDN-Java领域新星创作者&#x1f3c6;&#xff0c;保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文|经验分享|好用的网站工具分享&#x1f48e;&#x1f48e;&#x1f48e; &#x1f34e;座右…

【从零开始学Skynet】基础篇(七):Mysql数据库常用API

在上一篇中我们完成了对Mysql数据库的准备工作之后&#xff0c;这一篇我们写一个程序测试一下。 1、Mysql API 在写程序之前&#xff0c;我们先学习一下Mysql数据库常用API的使用&#xff1a; API说明mysql.connet(args)连接数据库&#xff0c;参数args是一个Lua表&#xff0c…

【2023 年第十三届 MathorCup 高校数学建模挑战赛】C 题 电商物流网络包裹应急调运与结构优化问题 建模方案及代码实现

【2023 年第十三届 MathorCup 高校数学建模挑战赛】C 题 电商物流网络包裹应急调运与结构优化问题 1 题目 电商物流网络由物流场地&#xff08;接货仓、分拣中心、营业部等&#xff09;和物流场 地之间的运输线路组成&#xff0c;如图 1 所示。受节假日和“双十一”、“618”等…

octave安装使用——吴恩达机器学习

下载octave 解压后双击octave.vbs进行安装 配置 pkg rebuildpkg list 使用基础命令 使用矩阵命令 移动数据 size&#xff1a;矩阵的行和列length&#xff1a;行和列的最大值 读取和存储数据 load&#xff1a;加载文件who&#xff1a;所有变量whos&#xff1a;更详细的变量…

Java容器使用注意点

前置&#xff1a;问题 判空集合转map集合遍历集合去重集合转数组数组转集合 一&#xff1a;集合判空 《阿里巴巴 Java 开发手册》的描述如下&#xff1a; 判断所有集合内部的元素是否为空&#xff0c;使用 isEmpty() 方法&#xff0c;而不是 size()0 的方式。 我们在开发中也…

EightCap易汇:外汇投资入门需要了解哪些必要知识?

外汇市场是国际投资市场&#xff0c;日内交易量巨大&#xff0c;盈利机会极多。外汇是一种含有杠杆的投资产品&#xff0c;杠杆带来了高收益&#xff0c;也会带来高风险&#xff0c;对于外汇新手来说存在一定难度。新手投资者要如何交易&#xff0c;才能抓住外汇市场的盈利机会…

金三银四没把握住,凉了...

大家好&#xff0c;前两天跟朋友感慨&#xff0c;今年的铜三铁四、裁员、疫情导致好多人都没拿到offer!现在互联网大厂终于迎来了应届生集中求职季。 对于想跳槽的软件测试人来说&#xff0c;绝对是个找工作的好时机。这时候&#xff0c;很多高薪技术岗、管理岗的缺口和市场需…

Nginx 正向代理、方向代理、端口转发

正向代理就是客户端代理&#xff0c;代理客户端&#xff0c;服务端不知道实际发起请求的客户端 正向代理中&#xff0c;proxy和client一般同一个lan或者网络可达&#xff0c;server与client一般不可达&#xff08;缓存场景除外&#xff09; 正向代理类似一个跳板机&#xff0c…

PNAS:土地利用和土地覆盖的变化决定了保护区的可持续性和影响

PNAS 中文题目&#xff1a; 土地利用和土地覆盖的变化决定了保护区的可持续性和影响 英文题目&#xff1a; Land-use and land-cover change shape the sustainability and impacts of protected areas 作者&#xff1a; Determinants and impacts of protected area remova…

ElasticSearch安装、启动、操作及概念简介

ElasticSearch快速入门 文件链接&#xff1a;https://pan.baidu.com/s/15kJtcHY-RAY3wzpJZIn4-w?pwd0k5a 提取码&#xff1a;0k5a 有些软件对于安装路径有一定的要求&#xff0c;例如&#xff1a;路径中不能有空格&#xff0c;不能有中文&#xff0c;不能有特殊符号&#xf…

若依— — 快速入门【源码分析】

若依— — 快速入门 1 什么是若依 官网地址&#xff1a;http://www.ruoyi.vip/ 若依是一款优秀的开源项目&#xff0c;涉及到企业开发中大部分的管理系统&#xff0c;我们依此为模板进行二次开发&#xff0c;可以快速开发出符合大部分公司中的后台管理系统。 2 使用若依 使用开…