Spring Boot | Spring Boot 整合“ 邮件任务“ 实现

目录:

  • Spring Boot 整合" 邮件任务" 实现 :
    • 一、发送 "纯文本邮件" :
      • (1) 添加 "邮件服务" 依赖启动器
      • (2) 添加 "邮件服务" 配置信息
      • (3) 定制 "邮件发送服务"
      • (4) "纯文本" 邮件发送 测试效果
    • 二、发送 带 "附件" 和 "图片" 的邮件 :
      • (1) 添加 "邮件服务" 依赖启动器
      • (2) 添加 "邮件服务" 配置信息
      • (3) 定制 "邮件发送服务"
      • (4) "复杂" 邮件发送 测试效果
    • 三、 发送 "模板邮件" :
      • (1) 添加 "邮件服务" + Thymeleaf 模板引擎" 依赖启动器
      • (2) 添加 "邮件服务" 配置信息
      • (3) 定制 "邮件模板" ( 模板页面 )
      • (4) 定制 "模板邮件 发送服务"
      • (5) "模板" 邮件发送 测试效果

Spring Boot 整合" 邮件任务" 实现 :

在这里插入图片描述

作者简介 :一只大皮卡丘,计算机专业学生,正在努力学习、努力敲代码中! 让我们一起继续努力学习!

该文章参考学习教材为:
《Spring Boot企业级开发教程》 黑马程序员 / 编著
文章以课本知识点 + 代码为主线,结合自己看书学习过程中的理解和感悟 ,最终成就了该文章

文章用于本人学习使用 , 同时希望能帮助大家。
欢迎大家点赞👍 收藏⭐ 关注💖哦!!!

(侵权可联系我,进行删除,如果雷同,纯属巧合)


  • 实际开发,邮件发送服务应该是网站的必备功能之一,例如 用户注册验证忘记密码给用户发送营销信息等。在早期开发过程中,开发人员通常会使用 JavaMail 相关 API 实现邮件发送功能,后来 Spring 推出 JavaMailSender 简化了邮件发送过程和实现Spring Boot 框架对 Spring提出邮件发送服务 也进行了 整合支持。下面将对 Spring Boot 框架 整合 支持邮件任务进行讲解

一、发送 “纯文本邮件” :

  • 邮件发送任务中,最简单的莫过于 纯文本邮件发送。在 定制 纯文本邮件 时,只需要 指定收件人 邮箱账号
    邮件标题 邮件内容即可。下面将先使用 Spring Boot 框架实现纯文本邮件发送任务

(1) 添加 “邮件服务” 依赖启动器

  • 创建项目后,在项目的pom.xml文件添加 "邮件服务" 依赖启动器 : spring-boot-starter-mail , 示例代码如下

    <!--   "邮件服务"的 依赖启动器     -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-mail</artifactId>
    </dependency>
    

    添加上述依赖后,Spring Boot 自动配置邮件服务会生效,在 邮件发送任务 时,可以直接使用 Spring框架提供的 JavaMailSender 接口或者它的实现类 : JavaMailSenderlmpl 类

(2) 添加 “邮件服务” 配置信息

  • 在项目中添加邮件服务依赖启动器后,还需要在 application.properties : 配置文件中添加 邮件服务 "相关"配置确保邮件服务正常发送

    application.properties :

    spring.application.name=chapter_27
    
    #发件人邮箱服务器相关配置
    spring.mail.host=smtp.qq.com
    spring.mail.port=587
    
    #配置 "个人qq账户"
    spring.mail.username= 12345678@qq.com
    #配置 "qq邮箱服务器授权码" --下面将介绍怎么获取这个"授权码"
    spring.mail.password= abcdefdafdsfasdf
    
    #邮件服务超时时间配置
    spring.mail.properties.mail.smtp.connectiontimeout=5000
    spring.mail.properties.mail.smtp.timeout=3000
    spring.mail.properties.mail.smtp.writetimeout=5000
    

    获得 “qq邮箱服务器授权码” 步骤


    上面配置信息中主要添加了 发件人邮箱服务配置邮件服务超时配置两部分内容。其中,发件人邮箱服务配置中,必须明确发件人邮箱对应的服务器主机(host)端口号(port) 以及用于 发件人认证用户名 ( username )qq邮箱服务器授权码 ( password )。获得 “qq邮箱服务器授权码” 步骤

    本示例中配置 的发件人邮箱QQ 邮箱,如果要配置的是其他邮箱( 例如 163搜狐等 ),必须更改对应的主机端口号以及 用户名授权码邮件服务超时配置可以灵活更改 “超时时间”,如果 没有配置邮件服务超时的话,Spring Boot内部默认超时无限制 的,这可能 会造成线程被无响应邮件服务器长时间阻塞

(3) 定制 “邮件发送服务”

  • 项目创建service,建立 邮件发送任务管理业务处理类 : SendEmailService,并在该类中编写一个 发送纯文本邮件业务方法

    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.mail.MailException;
    import org.springframework.mail.SimpleMailMessage;
    import org.springframework.mail.javamail.JavaMailSenderImpl;
    import org.springframework.stereotype.Service;
    
    @Service //加入ioc容器
    public class SendEmailService { //定制邮件发送业务的 "业务类"
    
        @Autowired
        private JavaMailSenderImpl MailSender; //定制"短信发送"的API类: JavaMailSenderImpl
    
        // @Value()注解 : 将application.properties : 配置文件中的 “属性值” 注入到下面的from属性中,给该属性充当"属性值"
        @Value("${spring.mail.username}")
        private String from; //发件人地址
    
        /**
         * @param to      收件人地址
         * @param subject 邮箱标题
         * @param text    邮箱内容
         */
        public void sendSimpleEmail(String to,String subject,String text) {
            //定制纯文本邮信息的 SimpleMailMessage对象
            SimpleMailMessage message = new SimpleMailMessage();
            message.setFrom(from); //设置"发件人"地址
            message.setTo(to); //设置"收件人"地址
            message.setSubject(subject); //设置"邮件标题"
            message.setText(text); //设置"邮件发送文本"
    
            try {
                //发送邮件
                MailSender.send(message);
            }catch (MailException e){
                System.out.println("纯文本邮件发送失败 "+e.getMessage());
            }
        }
    
    }
    

(4) “纯文本” 邮件发送 测试效果

  • 纯文本邮件发送 测试效果 :

    Chapter27ApplicationTests.java ( 测试类 ):

    import org.junit.jupiter.api.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.test.context.junit4.SpringRunner;
    
    @RunWith(SpringRunner.class)
    @SpringBootTest
    class Chapter27ApplicationTests {
    
        @Test
        void contextLoads() {
        }
          @Autowired
      private SendEmailService sendEmailService;
    
      @Test
      public void SendSimpleMailTest() {
          String to = "1262673963@qq.com";
          String subject = "【纯文本邮件】标题";
          String text = "Spring Boot纯文本邮件发送内容测试......";
          //发送纯文本邮件
          sendEmailService.sendSimpleEmail(to, subject, text);
          }
      }
    

    运行SendSimpleMailTest( )方法,即可实现 "纯文本邮件"发送

二、发送 带 “附件” 和 “图片” 的邮件 :

  • 发送纯文本邮件任务的实现相对来说非常简单,但多数时候,我们可能需要在 发送邮件的内容中嵌入静态资源( 例如一张图片 ),而不是简单的文本内容,甚至是在 发送邮件的时候需要携带 “附件” 。针对上述这种需求,下面我们将 用 Spring Boot 框架 实现邮件包含"静态资源"附件 的复杂 邮件的发送任务

(1) 添加 “邮件服务” 依赖启动器

  • 创建项目后,在项目的pom.xml文件添加 "邮件服务" 依赖启动器 : spring-boot-starter-mail , 示例代码如下

    <!--   "邮件服务"的 依赖启动器     -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-mail</artifactId>
    </dependency>
    

    添加上述依赖后,Spring Boot 自动配置邮件服务会生效 ,在 邮件发送任务时,可以直接使用 Spring框架 提供的 JavaMailSender 接口 或者 它的实现类 : JavaMailSenderlmpl 类

(2) 添加 “邮件服务” 配置信息

  • 在项目中添加邮件服务依赖启动器后,还需要在 application.properties : 配置文件中添加 邮件服务 "相关"配置确保邮件服务正常发送

    application.properties :

    spring.application.name=chapter_27
    
    #发件人邮箱服务器相关配置
    spring.mail.host=smtp.qq.com
    spring.mail.port=587
    
    #配置 "个人qq账户"
    spring.mail.username= 12345678@qq.com
    #配置 "qq邮箱服务器授权码" --下面将介绍怎么获取这个"授权码"
    spring.mail.password= abcdefdafdsfasdf
    
    #邮件服务超时时间配置
    spring.mail.properties.mail.smtp.connectiontimeout=5000
    spring.mail.properties.mail.smtp.timeout=3000
    spring.mail.properties.mail.smtp.writetimeout=5000
    

    获得 “qq邮箱服务器授权码” 步骤


    上面配置信息中主要添加了 发件人邮箱服务配置邮件服务超时配置 两部分内容。其中,发件人邮箱服务配置中,必须明确 发件人邮箱对应的服务器主机(host)端口号(port) 以及用 发件人认证用户名 ( username )qq邮箱服务器授权码 ( password )。获得 “qq邮箱服务器授权码” 步骤

    本示例中配置 的发件人邮箱QQ 邮箱,如果要配置的是其他邮箱( 例如 163搜狐等 ),必须更改对应的主机端口号以及 用户名授权码邮件服务超时配置可以灵活更改 “超时时间”,如果 没有配置邮件服务超时的话,Spring Boot内部默认超时无限制 的,这可能 会造成线程被无响应邮件服务器长时间阻塞

(3) 定制 “邮件发送服务”

  • 项目创建service,建立 邮件发送任务管理业务处理类 : SendEmailService,并在该类中编写一个 发送带附件图片邮件的业务方法

    SendEmailService.java :

    import jakarta.mail.MessagingException;
    import jakarta.mail.internet.MimeMessage;
    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.JavaMailSenderImpl;
    import org.springframework.mail.javamail.MimeMailMessage;
    import org.springframework.mail.javamail.MimeMessageHelper;
    import org.springframework.stereotype.Service;
    
    import java.io.File;
    
    @Service //加入ioc容器
    public class SendEmailService { //定制邮件发送业务的 "业务类"
    
        @Autowired
        private JavaMailSenderImpl MailSender; //定制"短信发送"的API类: JavaMailSenderImpl
    
        // @Value()注解 : 将application.properties : 配置文件中的 “属性值” 注入到下面的from属性中,给该属性充当"属性值"
        @Value("${spring.mail.username}")
        private String from; //发件人地址
    
        /**
         * 发送复杂邮件 ( 包括静态资源和邮件 ) -发送带"附件"和"图片"的邮件
         * @param to        收件人地址
         * @param subject   邮件标题
         * @param text      邮件内容
         * @param racId     静态资源唯一标识
         * @param rscPath   静态资源地址
         * @param filepath  附件地址
         */
        public void sendComplexEmail(String to, String subject, String text, String racId, String rscPath,String filepath) {
            //定制复杂邮件信息类 : MimeMessage类
            MimeMessage message = MailSender.createMimeMessage();
            try {
                //使用 MimeMessageHelper 帮助类,并设置multipart多部件使用为true
                MimeMessageHelper helper = new MimeMessageHelper(message, true);
                helper.setFrom(from); //设置"发件人地址"
                helper.setTo(to); //设置"收件人"地址
                helper.setSubject(subject); //设置"邮件"的标题
                helper.setText(text,true); //设置"邮件"的文本内容
    
                //设置"邮件静态资源"
                FileSystemResource res = new FileSystemResource(new File(rscPath));
                helper.addInline(racId,res);
    
                /*
                  substring() : 获取子串
                  lastIndexOf() : 返回与 "括号中字符串" 匹配的 "最后一个子串"的 "开始位置"
    
                  File.separator : 表示为"文件路径分隔符" :
                    在 Windows 系统中,File.separator的值是反斜杠 \ (因为一个文件的路径在 Windows 中可能被表示为 "C:\\Users\\Username\\Documents\\file.txt" )
                    在 Unix 或 Linux 系统中,File.separator的值是正斜杠 / (因为同一个文件的路径在这些系统上可能被表示为 "/home/username/Documents/file.txt" )
    
                  经过已有的操作, filepath.substring()方法中的参数为: 附件名称String所在的"下标位置" , 所以该方法最后获得的是 :附件的名称
                 */
                //设置"邮件附件"
                FileSystemResource file = new FileSystemResource(new File(filepath));
                //获取附件的"名称"
                String fileName = filepath.substring(filepath.lastIndexOf(File.separator));
                helper.addAttachment(fileName,file);
    
                //发送邮件
                MailSender.send(message);
                System.out.println("复杂邮件发送成功!");
    
            } catch (MessagingException e) {
                System.out.println("复杂邮件发送失败" + e.getMessage());
                e.printStackTrace();
            }
    
        }
    }
    

    上述代码中,sendComplexEmai( )方法需要接收的参数除了基本的发送信息外,还包括 静态资源唯一标识静态资源路径附件路径具体信息注释中都有说明。另外,在 定制复杂邮件信息时使用了 MimeMessageHelper类邮件信息 “封装处理”,包括设置内嵌 “静态资源”邮件附件

    其中设置邮件 内嵌静态资源方法addlnline ( String contentld,Resource resource )方法,设置 邮件附件 的方法为 :
    addAttachment ( String attachmentFilename, InputStreamSource inputStreamSource )方法

(4) “复杂” 邮件发送 测试效果

  • 复杂邮件发送 测试效果 :

    Chapter27ApplicationTests.java ( 测试类 ):

    import org.junit.jupiter.api.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.test.context.junit4.SpringRunner;
    
    @RunWith(SpringRunner.class)
    @SpringBootTest
    class Chapter27ApplicationTests {
    
        @Test
        void contextLoads() {
        }
    
        @Autowired
        private SendEmailService sendEmailService;
    
        @Test
        public void sendComplexEmailTest() {
            String to = "1262673963@qq.com";
            String subject = "【复杂邮件】标题";
            //定义邮件内容
            StringBuilder text = new StringBuilder(); //创建"字符串生成器"对象 , 可以不断往其中添加"字符串"
            text.append("<html><head></head>");
            text.append("<body><h1>祝大家元旦快乐!</h1>");
    
            // cid 为固定写法 , racId 是自定义的"资源唯一标识符"
            String rscId = "img001"; // 静态资源唯一标识
            text.append("<img src='cid:" +rscId+ "'/></body>");
            text.append("</html>");
    
            //指定静态资源文件 和 附近 的路径
            String rscpath = "C:\\Users\\86137\\Desktop\\1\\Java图片\\SpringBoot2.jpg"; //静态资源
            String filePath = "C:\\Users\\86137\\Desktop\\元旦放假注意事项.txt"; //附件
    
            //发送复杂邮件
            sendEmailService.sendComplexEmail(to,subject,text.toString(),rscId,rscpath,filePath);
        }
    }
    

    运行 sendComplexEmailTest( ) 方法,即可实现 "复杂邮件"发送


    上述代码中,根据前面定义的复杂邮件发送业务方法定制了 “各种参数”。其中,在定义邮件内容时使用了 Html 标签编辑邮件内容,并内嵌了一个 静态资源唯一标识rscId 的图片,还为邮件指定了携带附件路径。在邮件发送之前,务必要保证指定路径下存放有对应静态资源附件文件

    需要说明的是,编写 内嵌 "静态资源文件"时,cid嵌入式静态资源文件 “关键字”固定写法,如果 改变将无法识别 ; rscId 则属于自定义静态资源唯一标识一个邮件内容中可能会包括 ”多个静态资源“该属性用于区别唯一性

三、 发送 “模板邮件” :

  • 前面两个案例中,我们分别针对 纯文本邮件带附件及图片的 "复杂邮件"的使用进行了讲解和实现,这已经可以完成开发中通用邮件发送任务了。
    但是仔细思考可以发现,
    前面两种邮件的实现必须每次 “都手动” 定制邮件内容
    ,这在一些特定邮件发送任务中是相当麻烦的,例如 用户注册验证邮件等,这些邮件的主体内容基本一样主要是一些动态的用户名验证码激活码有所不同,所以,针对类似这种需求,完全可以 定制一些通用邮件模板 进行 邮件发送

(1) 添加 “邮件服务” + Thymeleaf 模板引擎" 依赖启动器

  • 创建项目后,在项目的pom.xml文件添加 "邮件服务" 依赖启动器 : spring-boot-starter-mail , 示例代码如下

    <!--   "邮件服务"的 依赖启动器     -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-mail</artifactId>
    </dependency>
    

    添加上述依赖后,Spring Boot 自动配置邮件服务会生效,在 邮件发送任务 时,可以直接使用 Spring框架 提供的 JavaMailSender 接口 或者 它的 实现类 : JavaMailSenderlmpl 类

  • 既然提到了使用 定制 "邮件模板"的方式实现通用邮件发送,少不了需要 前端模板页面支持,这里选择 Thymeleaf模板引擎定制模板邮件内容。在 pom.xml 文件中添加 “Thymeleaf 模板引擎依赖启动器 ,示例代码如下

    <!--  Thymeleaf模板引擎的"依赖启动器"  -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>
    

(2) 添加 “邮件服务” 配置信息

  • 在项目中添加邮件服务依赖启动器后,还需要在 application.properties : 配置文件中添加 邮件服务 "相关"配置确保邮件服务正常发送

    application.properties :

    spring.application.name=chapter_27
    
    #发件人邮箱服务器相关配置
    spring.mail.host=smtp.qq.com
    spring.mail.port=587
    
    #配置 "个人qq账户"
    spring.mail.username= 12345678@qq.com
    #配置 "qq邮箱服务器授权码" --下面将介绍怎么获取这个"授权码"
    spring.mail.password= abcdefdafdsfasdf
    
    #邮件服务超时时间配置
    spring.mail.properties.mail.smtp.connectiontimeout=5000
    spring.mail.properties.mail.smtp.timeout=3000
    spring.mail.properties.mail.smtp.writetimeout=5000
    

    获得 “qq邮箱服务器授权码” 步骤


    上面配置信息中主要添加了 发件人邮箱服务配置邮件服务超时配置 两部分内容。其中,发件人邮箱服务配置中,必须明确 发件人邮箱对应的 服务器主机(host)端口号(port) 以及用 发件人认证用户名 ( username )qq邮箱服务器授权码 ( password )。获得 “qq邮箱服务器授权码” 步骤

    本示例中配置 的发件人邮箱QQ 邮箱,如果要配置的是其他邮箱( 例如 163搜狐等 ),必须更改对应的主机端口号以及 用户名授权码邮件服务超时配置可以灵活更改 “超时时间”,如果 没有配置邮件服务超时的话,Spring Boot内部默认超时无限制 的,这可能 会造成线程被无响应邮件服务器长时间阻塞

(3) 定制 “邮件模板” ( 模板页面 )

  • 在项目的**模板页面文件夹** : templates 中添加**发送 "用户注册验证码"模板页面**,代码如下所示 :

    emailTemplate_vercode.html

    <!DOCTYPE html>
    <!-- 配置开启Thymeleaf页面开发 -->
    <html lang="en" xmlns:th="http://www/thymeleaf.org">
    <head>
        <meta charset="UTF-8">
        <title>用户验证码</title>
    </head>
    <body>
    
    <!-- th:text标签 表示动态显示/修改文本内容-->
    <!-- ${}表示从当前页面或从后端传递而来的参数中找"指定名称"的变量值-->
    <div>
        <span th:text="${username}">默认姓名</span>&nbsp;先生/女生,您好:
    </div>
    <p style="text-indent: 2em">
        您的用户验证码为: <span th:text="${code}" style="color: cornflowerblue">默认验证码</span>,请妥善保管。
    </p>
    </body>
    </html>
    

    上面代码中,模拟 注册用户发送 一个 动态验证码模板邮件页面包含两个变量 : usernamecode,它们将与 controller 后台交互动态填充

(4) 定制 “模板邮件 发送服务”

  • 项目创建service,建立 邮件发送任务管理业务处理类 : SendEmailService,并在该类中编写一个 发送HTML模板邮件业务方法示例代码如下所示

    SendEmailService.java :

    import jakarta.mail.MessagingException;
    import jakarta.mail.internet.MimeMessage;
    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.JavaMailSenderImpl;
    import org.springframework.mail.javamail.MimeMailMessage;
    import org.springframework.mail.javamail.MimeMessageHelper;
    import org.springframework.stereotype.Service;
    
    import java.io.File;
    
    @Service //加入ioc容器
    public class SendEmailService { //定制邮件发送业务的 "业务类"
    
        @Autowired
        private JavaMailSenderImpl MailSender; //定制"邮件发送"的API类: JavaMailSenderImpl
    
        // @Value()注解 : 将application.properties : 配置文件中的 “属性值” 注入到下面的from属性中,给该属性充当"属性值"
        @Value("${spring.mail.username}")
        private String from; //发件人地址
    
        public void sendTemplateEmail(String to,String subject,String content) {
            //定制"复杂邮件信息类" : MimeMessage类
            MimeMessage message = MailSender.createMimeMessage();
            try {
                //使用 MimeMessageHelper 帮助类,并设置multipart多部件使用为true
                MimeMessageHelper helper = new MimeMessageHelper(message, true);
                helper.setFrom(from); //设置"发件人地址"
                helper.setTo(to); //设置"收件人"地址
                helper.setSubject(subject); //设置"邮件"的标题
                helper.setText(content,true); //设置"邮件"的文本内容 --其中包含"模板邮件"的内容
    
                //发送邮件
                MailSender.send(message);
                System.out.println("模板邮件发送成功!");
    
            } catch (MessagingException e) {
                System.out.println("模板邮件发送失败" + e.getMessage());
                e.printStackTrace();
            }
    
        }
    }
    

    上述代码中 ,sendTemplateEmai( )方法主要用于处理 Html 内容 ( 包括 Thymeleaf 邮件模板 ) 的邮件发送,在定制 Html模板邮件信息时,使用了 MimeMessageHelper 类对 邮件信息 进行 封装处理

(5) “模板” 邮件发送 测试效果

  • 模板邮件发送 测试效果 :

    Chapter27ApplicationTests.java ( 测试类 ):

    import org.junit.jupiter.api.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.test.context.junit4.SpringRunner;
    import org.thymeleaf.TemplateEngine;
    import org.thymeleaf.context.Context;
    
    @RunWith(SpringRunner.class)
    @SpringBootTest
    class Chapter27ApplicationTests {
    
        @Autowired
        private SendEmailService sendEmailService; //业务类
    
        @Autowired
        private TemplateEngine templateEngine; //Thymeleaf提供的 TemplateEngine类 : 模板引擎解析器 , 用于解析"模板页面"
    
        @Test
        public void sendTemplateEmaiTest() {
            String to = "1262673963@qq.com";
            String subject = "【模板邮件】标题";
            //使用模板邮件 定制"邮件正文内容"
            Context context = new Context();
            //设置用于"模板页面"中的"动态数据"
            context.setVariable("username","小明");
            context.setVariable("code","456123");
            //使用 "模板引擎解析器" 解析 "模板页面" , 让其变成 "发送邮件" 所需的"参数"
            String emailContent = templateEngine.process("emailTemplate_vercode", context);//将"动态数据" 用在"模板页面"上
    
            //发送模板 (发送"模板邮件")
            sendEmailService.sendTemplateEmail(to,subject,emailContent);
        }
    
    }
    

    上述代码中,先使用 @Autowired 注解引入了 Thymeleaf 提供模板引擎解析器 : TemplateEngine ( 用于 解析 “模板页面”),然后定制为 : 模板邮件发送 所需的参数。其中,在定制模板邮件内容时,先使用 Context 对象对模板邮件中涉及的变量 usernamecode 进行 动态赋值 ; 然后使用 模板引擎解析器process( String template,lContext context )方法解析模板 ( 让其变成 “发送邮件所需的"参数" ) , 该方法的第1个参数指的是要解析的 Thymeleaf 模板页面第2个参数用于设置页面中动态数据


    前面几个案例邮件发送方法业务处理中,都只是演示一个收件人的情况,如果要 演示一次 指定 多个收件人 时,将 收件人地址 转为 字符串类型数组 即可,例如 : Stringll tos = new String [ ] {“itshitou@sohu.com”,“2127269781@q9.com”} 。

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

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

相关文章

DSOX4054A 示波器:500 MHz,4 个模拟通道

DSOX4054A 示波器 500 MHz 4 个模拟通道 100 万波形/秒捕获率 4000 X 系列拥有一系列引以为傲的配置&#xff0c;包括采用了电容触摸屏技术的 12.1 英寸显示屏、InfiniiScan 区域触摸触发、100 万波形/秒捕获率、MegaZoom IV 智能存储器技术和标配分段存储器。 主要特点 —…

信息技术自主可控的意义,针对国产化替换,服务器虚拟化或比公有云更具优势

我们之前在文章《博通收购VMware后&#xff0c;经销商和用户如何应对&#xff1f;新出路&#xff1a;虚拟化国产替代&#xff0c;融入信创云生态》中提到&#xff1a; 从信创整体发展和政策标准来看&#xff0c;供应商必须满足两个条件&#xff1a;一是融入国产信息技术生态&am…

Win10 WSL2 Ubuntu 22.04 配置深度学习环境

文章目录 WSL安装Anaconda下载Anaconda安装包安装配置conda命令conda换国内源conda初始化shell环境conda init手动源激活脚本&#xff1a; 安装Windows上的NVIDIA GPU驱动WSL安装CUDA Toolkit安装12.1版本环境配置报错1报错2 内存不足导致安装崩溃问题描述问题分析问题解决 WSL…

PHP 框架安全:ThinkPHP 序列 漏洞测试.

什么是 ThinkPHP 框架. ThinkPHP 是一个流行的国内 PHP 框架&#xff0c;它提供了一套完整的安全措施来帮助开发者构建安全可靠的 web 应用程序。ThinkPHP 本身不断更新和改进&#xff0c;以应对新的安全威胁和漏洞。 目录&#xff1a; 什么是 ThinkPHP 框架. ThinkPHP 框架…

C++基础中的存储类别

存储的类别是变量的属性之一&#xff0c;C语言定义了4种变量的存储类别&#xff0c;分别是auto变量、static变量、register变量和extern变量。以下重点介绍这几种类型。 一、auto变量 auto变量是C默认的存储类型。函数内未加存储类型说明的变量均被称为自动变量&#xff0c;即…

深入理解Django:中间件与信号处理的艺术

title: 深入理解Django&#xff1a;中间件与信号处理的艺术 date: 2024/5/9 18:41:21 updated: 2024/5/9 18:41:21 categories: 后端开发 tags: Django中间件信号异步性能缓存多语言 引言 在当今的Web开发领域&#xff0c;Django以其强大的功能、简洁的代码结构和高度的可扩…

Vue 中动态与静态处理 Element UI/Element Plus 组件禁用状态样式

目录 一、静态样式修改 - 使用 ::v-deep 穿透组件样式二、选择器的优先级和匹配顺序三、动态添加样式 - 使用 Vue 实例属性&#xff08;非推荐&#xff09;四、区别总结五、应用场景总结 本文主要探讨在 Vue.js 项目中&#xff0c;特别是搭配 Element UI 或 Element Plus 组件库…

C语言队列的含义与队列数据操作代码详解!

引言&#xff1a;于本篇博客当中&#xff0c;我们将讲到数据结构——队列的有关知识。而对于这次的队列&#xff0c;我们将会在单链表的基础上实现。 更多有关C语言和数据结构知识详解可前往个人主页&#xff1a;计信猫 一&#xff0c;队列的含义 队列是一种特殊的线性表&#…

一文了解spring事务特性

推荐工具 objectlog 对于重要的一些数据&#xff0c;我们需要记录一条记录的所有版本变化过程&#xff0c;做到持续追踪&#xff0c;为后续问题追踪提供思路。objectlog工具是一个记录单个对象属性变化的日志工具,工具采用spring切面和mybatis拦截器相关技术编写了api依赖包&a…

Vue2 组件通信方式

props/emit props 作用&#xff1a;父组件通过 props 向子组件传递数据parent.vue <template><div><Son :msg"msg" :pfn"pFn"></Son></div> </template><script> import Son from ./son export default {name: …

面向对象进阶——内部类

1、初始内部类 什么是内部类&#xff1f; 类的五大成员&#xff1a; 属性、方法、构造方法、代码块、内部类 在一个类的里面&#xff0c;再定义一个类。 举例&#xff1a;在A类大的内部定义B类&#xff0c;B类就被称为内部类 public class Outer{ 外部类 public …

流媒体学习之路(WebRTC)——GCC中ProbeBitrateEstimator和AcknowledgedBitrateEstimator的大作用(7)

流媒体学习之路(WebRTC)——GCC中ProbeBitrateEstimator和AcknowledgedBitrateEstimator的大作用&#xff08;7&#xff09; —— 我正在的github给大家开发一个用于做实验的项目 —— github.com/qw225967/Bifrost目标&#xff1a;可以让大家熟悉各类Qos能力、带宽估计能力&a…

抛弃英特尔,采用自研M4芯片,苹果公司的iPad Pro有什么好?

【科技明说 &#xff5c; 科技热点关注】 看到​苹果公司最新发布的M4芯片iPad Pro&#xff0c;我的眼前一亮&#xff0c;“其是否又该更换新pad了&#xff1f;”在这样的扪心自问之中&#xff0c;我发现了M4芯片的iPad Pro几大好处。 一是性能更好&#xff0c;M4芯片采用第二…

系统Cpu利用率降低改造之路

系统Cpu利用率降低改造之路 一.背景 1.1 系统背景 该系统是一个专门爬取第三方数据的高并发系统&#xff0c;该系统单台机器以每分钟400万的频次查询第三方数据&#xff0c;并回推给内部第三方系统。从应用类型上看属于IO密集型应用,为了提高系统的吞吐量和并发&#xff0c;…

解决电脑睡眠后,主机ping不通VMware虚拟机

文章目录 问题解决方法方法一方法二注意 问题 原因&#xff1a;电脑休眠一段时间&#xff0c;再次打开电脑就ping不通VMware虚拟机。 解决方法 方法一 重启电脑即可&#xff0c;凡是遇到电脑有毛病&#xff0c;重启能解决90%问题。但是重启电脑比较慢&#xff0c;而且重启…

system函数和popen函数

system函数 #include <stdlib.h> *int system(const char command); system函数在linux中的源代码&#xff1a; int system(const char * cmdstring) {pid_t pid;int status;if(cmdstring NULL){return (1);}if((pid fork())<0){status -1;}else if(pid 0){ //子…

Spring MVC(三) 参数传递

1 Controller到View的参数传递 在Spring MVC中&#xff0c;把值从Controller传递到View共有5中操作方法&#xff0c;分别是。 使用HttpServletRequest或HttpSession。使用ModelAndView。使用Map集合使用Model使用ModelMap 使用HttpServletRequest或HttpSession传值 使用HttpSe…

Vue-Cli脚手架项目的搭建【新手快速入手】

目录 一、Vue CLI脚手架简介☺ 1.Node.js前置环境的安装 2.安装npm管理器 3.安装淘宝镜像(cnpm) 二、安装vue-cli 1. 版本号查看 2.旧版本卸载 3.新版本安装 4.检查 三、Vue项目的搭建 &#x1f4cc;进入Vue项目管理器 ★命令方式创建 若localhost拒绝访问怎么办&…

深度剖析:SSD能否全面取代HDD?-2

近日&#xff0c;希捷针对SSD即将全面取代HDD的市场预言也提出站在HDD厂商角度不同的观点。 这些观点出自希捷的一份演示文稿&#xff0c;实质上是对Pure Storage首席执行官Charlie Giancarlo所称“五年内不会再有新的磁盘系统出售”这一论断的回应&#xff0c;意味着到2028年底…

(十六)Servlet教程——Servlet文件下载

Servlet文件下载 文件下载是将服务器上的资源下载到本地&#xff0c;可以通过两种方式来下载服务器上的资源。第一种是使用超链接来下载&#xff0c;第二种是通过代码来下载。 超链接下载 在HTML或者JSP页面中使用超链接时&#xff0c;可以实现页面之间的跳转&#xff0c;但是…