SpringBoot实现发邮件功能+邮件内容带模版

news2025/3/19 15:12:52

发送简单邮件+模版邮件

1.pom引入依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
            <version>2.5.13</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>

2.配置yaml文件

  mail:
    host: smtp.qq.com
    port: 465  # 必须改用SSL专用端口
    username: 配置发件人的邮箱
    password: 发件人的秘钥不是登录密码
    properties:
      mail:
        smtp:
          auth: true
          ssl:
            enable: true  # 显式启用SSL
          socketFactory:
            class: javax.net.ssl.SSLSocketFactory  # 指定SSL工厂
        starttls:
          enable: false  # 禁用STARTTLS(与SSL互斥)

3.代码

    @GetMapping("/sendSimpleMail")
    public Result sendMail() {
        String recipientStr ="收件人邮箱";
        SendMailParam sendMailParam = new SendMailParam();
        sendMailParam.setContent("你好,现在是 "+System.currentTimeMillis()+",邮件发送成功!");
        mailUtil.sendSimpleMessage(recipientStr, "测试邮件主题", sendMailParam, "");
        return Result.ok();
    }

    @GetMapping("/sendTemplateMail")
    public Result sendTemplateMail() {
        String recipientStr ="收件人邮箱";
        mailUtil.sendThemplateMessage(recipientStr,"测试邮件主题");
        return Result.ok();
    }
 
import com.hmdp.config.MailConfig;
import com.hmdp.entity.SendMailParam;
import com.hmdp.service.ISendMailService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.FileSystemResource;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.io.*;

/**
 * @author don
 * @version 1.0.0
 * @ClassName SendMailServiceImpl.java
 * @Description TODO
 * @createTime 2024年03月06日 17:38:00
 */
@Service
@Slf4j
public class SendMailServiceImpl implements ISendMailService {

    @Autowired
    private JavaMailSenderImpl mailSender;

    @Autowired
    private TemplateEngine templateEngine;


    @Value("${spring.mail.username}")
    private String from;


    @Override
    public void sendSimpleMessage(String to, String subject, SendMailParam sendMailParam, String fileList) {
        try {
            MimeMessage mailMessage=mailSender.createMimeMessage();
            MimeMessageHelper helper=new MimeMessageHelper(mailMessage,true);
            //设置寄件人
            helper.setFrom(from);
            //设置邮件标题
            helper.setSubject(subject);
            //设置邮件内容
            helper.setText(sendMailParam.getContent());
            //设置收件人
            helper.setTo(to);
            // 发送邮件
            mailSender.send(mailMessage);
        } catch (MessagingException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void sendThemplateMessage(String to, String subject) {
        try {
            MimeMessage mailMessage = mailSender.createMimeMessage();
            MimeMessageHelper helper = new MimeMessageHelper(mailMessage, true);
            //设置寄件人
            helper.setFrom(from);
            //设置邮件标题
            helper.setSubject(subject);
            //设置收件人
            helper.setTo(to);
            //设置模板
            //thymeleaf模版解析成String
            Context ctx = new Context();
            ctx.setVariable("mailSubject", "测试主题");
            ctx.setVariable("noticeTime", "2025-03-18");
            ctx.setVariable("noticeNumber", "ASDF456");
            ctx.setVariable("name", "张三");
            ctx.setVariable("billDate", "2025-03-18");
            ctx.setVariable("groupCode", "45");
            ctx.setVariable("creator", "admin");
            ctx.setVariable("content", "hello world !");
            //模板填充数据
            String htmlContent = templateEngine.process("data", ctx);
            helper.setText(htmlContent, true);
            // 发送邮件
            mailSender.send(mailMessage);
        } catch (MessagingException e) {
            throw new RuntimeException(e);
        }
    }

 
}

4.模板位置及内容 

<!DOCTYPE html>
<html xmlns:th="http://www.w3.org/1999/xhtml">
<head> 
<meta charset="utf-8"> 
<title>表格</title> 
</head>
<body>

<table border="1">
<tr>
  <td><h4>邮件主题</h4></td>
  <td colspan="5">
    <a th:href="@{http://ip/}" th:text="${mailSubject}"> </a>
  </td>
</tr>
<tr>
  <td><h4>通知时间</h4></td>
  <td colspan="5" th:text="${noticeTime}"></td>
</tr>
<tr>
  <td><h4>通知类型</h4></td>
  <td colspan="3">
    <span th:text="${noticeText}" th:style="${noticeText == '正常通知' ? 'color: green;' : 'color: red;' }"></span>
  </td> 
  <td><h4>任务编号</h4></td>
  <td  colspan="3">
	  <span style="color: red;"><span th:text="${noticeNumber}"></span></span>
  </td> 
</tr>
<tr>
  <td><h4>姓名</h4></td>
  <td colspan="3" th:text="${name}">

  </td> 
  <td><h4>日期</h4></td>
  <td  colspan="3" th:text="${billDate}">

  </td> 
</tr>
<tr>代码</h4></td>
  <td colspan="3" th:text="${groupCode}">

  </td> 
  <td><h4>创建者</h4></td>
  <td  colspan="3" th:text="${creator}">

  </td> 
</tr>
<tr>
  <td><h4>通知内容</h4></td>
  <td colspan="5">

      <div>
          <span th:utext="${content}"></span>
      </div>
  </td>
</tr>
</table>

</body>
</html>
<style>
  table, th, td {
    border: 1px solid black;
    border-collapse: collapse;
  }
  div {
    margin-top:10px;
  }
  .icon {
    text-align: center;
    display: inline-block;
    width: 20px;
    height: 20px;
    background-color: yellowgreen;
    border-radius: 50%;
    color: #fff;
    margin-right: 4px;
    font-weight: bold;
  }

  .icon.success {
    background-color: yellowgreen;
    line-height: 22px;
  }
  .icon.error {
    background-color: red;
    line-height: 18px;
  }
  td {
    padding: 0px 10px;
  }

</style>

5.效果示例

 6.模版邮件注意事项

     代码里的字段要和模板里的字段对应上

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

npm 报错 unable to resolve dependency tree

如下图&#xff1a; 解决&#xff1a;npm install --legacy-peer-deps 其实提示上有&#xff1a;npm ERR! Fix the upstream dependency conflict, or retry npm ERR! this command with --force, or --legacy-peer-deps

【蓝桥杯每日一题】3.17

&#x1f3dd;️专栏&#xff1a; 【蓝桥杯备篇】 &#x1f305;主页&#xff1a; f狐o狸x 他们说内存泄漏是bug&#xff0c;我说这是系统在逼我进化成SSR级程序员 OK来吧&#xff0c;不多废话&#xff0c;今天来点有难度的&#xff1a;二进制枚举 二进制枚举&#xff0c;就是…

Linux:冯诺依曼体系结构、操作系统、进程概念(一.初识进程)

文章目录 1.冯诺依曼体系结构总线与数据传输通路为什么有内存这个部分计算机存储结构 2.操作系统(Operator System)2.1 概念2.2 设计OS的目的2.3 理解“管理”先描述再组织 2.4 用户使用系统调用和库函数&#xff08;lib&#xff09;概念 总结 3.初识进程3.1 基本事实与引入3.2…

动手学深度学习:CNN和LeNet

前言 该篇文章记述从零如何实现CNN&#xff0c;以及LeNet对于之前数据集分类的提升效果。 从零实现卷积核 import torch def conv2d(X,k):h,wk.shapeYtorch.zeros((X.shape[0]-h1,X.shape[1]-w1))for i in range(Y.shape[0]):for j in range(Y.shape[1]):Y[i,j](X[i:ih,j:jw…

删除排序链表中的重复元素(js实现,LeetCode:83)

看到这道题的第一反应是使用快慢指针&#xff0c;之前做过类似的题&#xff1a;删除有序数组中的重复项&#xff08;js实现&#xff0c;LeetCode&#xff1a;26&#xff09;原理都是一样,区别是这题需要将重复项删除&#xff0c;所以只需要走一遍单循环就可以实现 /*** Defini…

单片机自学总结

自从工作以来&#xff0c;一直努力耕耘单片机&#xff0c;至今&#xff0c;颇有收获。从51单片机&#xff0c;PIC单片机&#xff0c;直到STM32&#xff0c;以及RTOS和Linux&#xff0c;几乎天天在搞:51单片机&#xff0c;STM8S207单片机&#xff0c;PY32F003单片机&#xff0c;…

Unity教程(二十二)技能系统 分身技能

Unity开发2D类银河恶魔城游戏学习笔记 Unity教程&#xff08;零&#xff09;Unity和VS的使用相关内容 Unity教程&#xff08;一&#xff09;开始学习状态机 Unity教程&#xff08;二&#xff09;角色移动的实现 Unity教程&#xff08;三&#xff09;角色跳跃的实现 Unity教程&…

HTML5扫雷游戏开发实战

HTML5扫雷游戏开发实战 这里写目录标题 HTML5扫雷游戏开发实战项目介绍技术栈项目架构1. 游戏界面设计2. 核心类设计 核心功能实现1. 游戏初始化2. 地雷布置算法3. 数字计算逻辑4. 扫雷功能实现 性能优化1. DOM操作优化2. 算法优化 项目亮点技术难点突破1. 首次点击保护2. 连锁…

【Git学习笔记】Git分支管理策略及其结构原理分析

【Git学习笔记】Git分支管理策略及其结构原理分析 &#x1f525;个人主页&#xff1a;大白的编程日记 &#x1f525;专栏&#xff1a;Git学习笔记 文章目录 【Git学习笔记】Git分支管理策略及其结构原理分析前言一.合并冲突二. 分支管理策略2.1 分支策略2.2 bug分支2.3 删除临…

Spring Cloud Alibaba Nacos 2023.X 配置问题

文章目录 问题现象&#xff08;一&#xff09;解决方法&#xff08;一&#xff09;问题现象&#xff08;二&#xff09;解决方法&#xff08;二&#xff09;问题现象&#xff08;三&#xff09;解决方法&#xff08;三&#xff09; 问题现象&#xff08;一&#xff09; Spring…

厨卫行业供应链产销协同前中后大平台现状需求分析报告+P120(120页PPT)(文末有下载方式)

资料解读&#xff1a;厨卫行业供应链产销协同前中后大平台现状需求分析报告 详细资料请看本解读文章的最后内容。在当前厨卫行业竞争激烈的市场环境下&#xff0c;企业的发展战略和业务模式创新至关重要。本次解读的报告围绕某厨卫企业展开&#xff0c;深入探讨其供应链产销协同…

我在哪,要去哪

在直播间听到一首好听的歌《我在哪&#xff0c;要去哪》-汤倩。 遇见的事&#xff1a;21~24号抽调去招生。 感受到的情绪&#xff1a;公假吗&#xff1f;给工作量吗&#xff1f;月工作量不够扣钱吗&#xff1f;报销方便吗&#xff1f;有事情&#xff0c;从来不解决后顾&#x…

SpringBoot-2整合MyBatis以及基本的使用方法

目录 1.引入依赖 2.数据库表的创建 3.数据源的配置 4.编写pojo类 5.编写controller类 6.编写接口 7.编写接口的实现类 8.编写mapper 1.引入依赖 在pom.xml引入依赖 <!-- mysql--><dependency><groupId>com.mysql</groupId><artifac…

本周安全速报(2025.3.11~3.17)

合规速递 01 瑞士出台新规&#xff1a;关基设施遭遇网络攻击需在24小时内上报 原文: https://www.bleepingcomputer.com/news/security/swiss-critical-sector-faces-new-24-hour-cyberattack-reporting-rule/ 新规要求&#xff0c;关键基础设施组织发现网络攻击后&…

【css酷炫效果】纯CSS实现瀑布流加载动画

【css酷炫效果】纯CSS实现瀑布流加载动画 缘创作背景html结构css样式完整代码基础版进阶版(无限往复加载) 效果图 想直接拿走的老板&#xff0c;链接放在这里&#xff1a;https://download.csdn.net/download/u011561335/90492012 缘 创作随缘&#xff0c;不定时更新。 创作…

咖啡点单小程序毕业设计(JAVA+SpringBoot+微信小程序+完整源码+论文)

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 随着社会的快速发展和…

网络编程套接字【端口号/TCPUDP/网络字节序/socket编程接口/UDPTCP网络实验】

网络编程套接字 0. 前言1. 认识端口号2. 认识TCP和UDP协议3. 网络字节序4. socket编程接口5. 实现一个简单的UDP网络程序5.1 需求分析5.2 头文件准备5.3 服务器端设计5.4 客户端设计5.5 本地测试5.6 跨网络测试5.7 UDP小应用——客户端输入命令&#xff0c;服务器端执行 6. 地址…

DeepSeek 3FS 与 JuiceFS:架构与特性比较

近期&#xff0c;DeepSeek 开源了其文件系统 Fire-Flyer File System (3FS)&#xff0c;使得文件系统这一有着 70 多年历时的“古老”的技术&#xff0c;又获得了各方的关注。在 AI 业务中&#xff0c;企业需要处理大量的文本、图像、视频等非结构化数据&#xff0c;还需要应对…

Unity WebGL项目访问时自动全屏

Unity WebGL项目访问时自动全屏 打开TemplateData/style.css文件 在文件最下方添加红色框内的两行代码 使用vscode或者其他编辑器打开index.html 将按钮注释掉&#xff0c;并且更改为默认全屏

C# WPF编程-Menu

C# WPF编程-Menu 布局&#xff1a;代码&#xff1a;效果 在WPF&#xff08;Windows Presentation Foundation&#xff09;中&#xff0c;Menu控件用于创建下拉菜单或上下文菜单&#xff0c;它提供了丰富的定制选项来满足不同的应用需求。下面将介绍如何在WPF应用程序中使用Menu…