Spring Boot 搭建邮件发送系统:开启你的邮件自动化之旅

Spring Boot 搭建邮件发送系统:开启你的邮件自动化之旅

引言

在当今数字化时代,邮件作为一种重要的通信方式,广泛应用于各个领域。无论是企业与客户之间的沟通,还是系统内部的通知提醒,邮件都发挥着不可或缺的作用。在日常工作中,我们经常会遇到这样的场景:用户注册成功后,需要向其发送欢迎邮件;系统出现异常时,要及时向管理员发送报警邮件;电商平台在促销活动期间,向用户发送活动通知邮件。这些场景都对邮件发送的及时性、稳定性和准确性提出了很高的要求。

Spring Boot 作为一款热门的 Java 开发框架,为我们搭建邮件发送系统提供了便捷高效的解决方案。它通过简单的配置和丰富的接口,让我们能够轻松地实现邮件发送功能,并且可以根据实际需求进行灵活扩展。接下来,就让我们一起深入探索如何使用 Spring Boot 搭建强大的邮件发送系统。

搭建前的准备

开发环境与工具

在开始搭建 Spring Boot 邮件发送系统之前,我们需要确保开发环境的正确性和开发工具的可用性。

Java 作为 Spring Boot 的基础,其版本的选择至关重要。推荐使用 Java 8 及以上版本,因为这些版本提供了更强大的功能和更好的性能优化,同时对新特性的支持也更加完善。例如,Java 8 引入的 Lambda 表达式和 Stream API,能够极大地简化代码编写,提高开发效率。如果你还没有安装 Java,可以前往Oracle 官网下载并安装对应版本。在安装完成后,通过命令行输入java \-version来验证是否安装成功。如果显示出 Java 的版本信息,那就说明安装无误啦。

开发工具方面,IntelliJ IDEA 是一个非常不错的选择。它具有强大的代码智能提示、代码导航和调试功能,能够帮助我们快速定位和解决问题。比如,在编写代码时,IDEA 会根据我们输入的代码自动提示相关的类、方法和变量,大大提高了编码速度。当然,如果你习惯使用 Eclipse 等其他开发工具,也是完全可以的,它们同样能够满足我们的开发需求。如果你还没有安装 IDEA,可以从JetBrains 官网下载并安装。安装完成后,打开 IDEA,创建一个新的 Spring Boot 项目。在创建项目的过程中,IDEA 会引导你选择项目的基本配置,如项目名称、项目路径、Spring Boot 版本等,按照默认配置或者根据自己的需求进行选择即可。

账号与授权码获取

接下来,我们需要获取一个用于发送邮件的邮箱账号,并开启 SMTP 服务获取授权码。这里我们以 QQ 邮箱为例进行演示。

首先,登录 QQ 邮箱,点击右上角的 "设置" 按钮,在下拉菜单中选择 "账户" 选项,进入账户设置页面。在账户设置页面中,找到 "POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV 服务" 区域,点击 "POP3/SMTP 服务" 右侧的 "开启" 按钮,如图 1 所示。

图 1:开启 SMTP 服务

此时,系统会弹出一个验证窗口,要求我们通过短信验证的方式来确认是本人操作。按照提示,发送指定内容的短信到指定号码,发送完成后点击 "我已发送" 按钮。验证通过后,就会生成一个 16 位的授权码,如图 2 所示。

图 2:获取授权码

请务必妥善保管这个授权码,它就相当于你邮箱的 "第二密码",在后续配置邮件发送功能时会用到。如果不小心泄露了授权码,可能会导致你的邮箱账号被盗用,造成不必要的损失。如果你忘记了授权码,可以回到这个页面,重新获取一个新的授权码。获取到授权码后,我们就完成了搭建前的准备工作,可以开始正式搭建 Spring Boot 邮件发送系统啦!

搭建步骤

创建 Spring Boot 项目

首先,我们使用 Spring Initializr 来快速创建一个 Spring Boot 项目。Spring Initializr 是一个基于 Web 的工具,它能帮助我们轻松地生成 Spring Boot 项目的基础结构。打开你的浏览器,访问Spring Initializr 官网,你会看到一个简洁的页面,上面有各种配置选项。

在 "Project" 下拉框中,选择 "Maven Project",表示我们使用 Maven 作为项目的构建工具。Maven 是一个强大的项目管理工具,它可以自动下载项目所需的依赖包,并帮助我们管理项目的生命周期。在 "Language" 下拉框中,选择 "Java",因为我们使用 Java 语言进行开发。接着,在 "Spring Boot" 下拉框中,选择你想要使用的 Spring Boot 版本,这里我们选择最新的稳定版本,以确保能够享受到最新的特性和优化。

在 "Project Metadata" 区域,填写项目的基本信息。"Group" 通常填写你的组织域名的逆序,比如 "com.example";"Artifact" 是项目的唯一标识符,你可以根据项目的实际情况进行命名,比如 "mail - sender - system";"Name" 是项目的名称,你可以自定义一个有意义的名称,比如 "Spring Boot Mail Sender System";"Description" 是项目的描述,你可以简要地介绍一下项目的功能和用途;"Package name" 是项目的包名,它会根据你填写的 "Group" 和 "Artifact" 自动生成,你也可以根据自己的喜好进行修改。在 "Packaging" 下拉框中,选择 "Jar",表示我们将项目打包成可执行的 JAR 文件。

在 "Dependencies" 区域,点击 "Add Dependencies" 按钮,搜索并添加 "Spring Web" 和 "Spring Mail" 依赖。"Spring Web" 依赖将帮助我们快速搭建 Web 服务,方便后续测试邮件发送功能;"Spring Mail" 依赖则是实现邮件发送的核心依赖,它提供了一系列的接口和类,让我们能够轻松地发送邮件。添加完成后,点击 "Generate" 按钮,Spring Initializr 会根据你的配置生成一个压缩包,将其下载并解压到你喜欢的目录。

解压完成后,打开 IntelliJ IDEA,点击 "File" -> "Open",选择解压后的项目目录,等待 IDEA 加载项目。加载完成后,你会看到项目的目录结构,其中 "src/main/java" 目录用于存放 Java 源代码,"src/main/resources" 目录用于存放配置文件和静态资源,"src/test/java" 目录用于存放测试代码。

添加邮件依赖

打开项目的 "pom.xml" 文件,在\<dependencies\>标签内,我们可以看到已经添加了 "Spring Web" 和 "Spring Mail" 依赖。其中,"Spring Mail" 依赖的配置如下:

xml 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
</dependency>

这个依赖的作用是引入 Spring 框架对邮件发送的支持,它基于 JavaMail API 进行了封装,提供了更简洁、易用的接口。通过添加这个依赖,我们可以在项目中使用 Spring 提供的邮件发送功能,而无需手动处理复杂的邮件发送逻辑。同时,Spring Boot 会自动配置相关的 Bean,使得我们能够快速上手,轻松实现邮件发送功能。

配置邮件服务器

在 "src/main/resources" 目录下,找到 "application.properties" 或 "application.yml" 文件,这里我们以 "application.yml" 为例进行配置。在文件中添加以下内容:

yaml 复制代码
spring:
  mail:
    host: smtp.qq.com # 邮件服务器地址,这里以QQ邮箱为例
    port: 587 # 邮件服务器端口,QQ邮箱的SMTP端口为587
    username: your_email@qq.com # 你的邮箱账号
    password: your_authorization_code # 你的邮箱授权码,不是登录密码
    properties:
      mail:
        smtp:
          auth: true # 开启认证
          starttls:
            enable: true # 开启TLS加密
            required: true

下面对各项配置进行详细说明:

  • spring\.mail\.host:指定邮件服务器的地址。不同的邮箱服务商有不同的 SMTP 服务器地址,这里我们使用 QQ 邮箱,其 SMTP 服务器地址为 "smtp.qq.com"。如果你使用的是其他邮箱,比如 163 邮箱,其 SMTP 服务器地址为 "smtp.163.com",需要根据实际情况进行修改。

  • spring\.mail\.port:指定邮件服务器的端口。QQ 邮箱的 SMTP 端口为 587,同样,不同邮箱的端口可能不同,163 邮箱的 SSL 加密端口为 465 或 994,普通端口为 25,具体端口需要参考对应邮箱的官方文档。

  • spring\.mail\.username:填写你的邮箱账号,用于登录邮件服务器进行邮件发送。

  • spring\.mail\.password:这里填写的是邮箱的授权码,而不是登录密码。为了安全起见,现在很多邮箱都不允许直接使用登录密码进行 SMTP 登录,需要获取授权码来代替密码。在前面的准备工作中,我们已经获取了 QQ 邮箱的授权码,将其填写在这里即可。

  • spring\.mail\.properties\.mail\.smtp\.auth:设置为 "true",表示开启邮件服务器的认证功能,只有认证通过后才能进行邮件发送。

  • spring\.mail\.properties\.mail\.smtp\.starttls\.enablespring\.mail\.properties\.mail\.smtp\.starttls\.required:这两个配置用于开启 TLS 加密。TLS(Transport Layer Security)是一种安全协议,用于在客户端和服务器之间建立安全的连接,防止邮件内容在传输过程中被窃取或篡改。将这两个配置都设置为 "true",确保邮件传输的安全性。

通过以上配置,我们就完成了邮件服务器的基本设置,接下来就可以编写代码实现邮件发送功能啦。

发送邮件代码实现

创建邮件发送工具类

在 Spring Boot 中,我们可以创建一个工具类来封装邮件发送的逻辑,使其更加模块化和易于维护。首先,在src/main/java目录下,创建一个新的包,比如com\.example\.mailsender\.service,在该包下创建一个名为MailService的类,并添加以下代码:

java 复制代码
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.stereotype.Service;

@Service
public class MailService {

    @Autowired
    private JavaMailSender javaMailSender;

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

    /**
     * 发送简单邮件
     * @param to 收件人邮箱
     * @param subject 邮件主题
     * @param content 邮件内容
     */
    public void sendSimpleMail(String to, String subject, String content) {
        SimpleMailMessage message = new SimpleMailMessage();
        message.setFrom(from);
        message.setTo(to);
        message.setSubject(subject);
        message.setText(content);
        javaMailSender.send(message);
    }
}

下面对这段代码进行详细解释:

  • @Service注解:将该类标记为一个服务组件,Spring 容器会自动扫描并创建该类的实例,以便在其他地方通过依赖注入使用。

  • @Autowired注解:用于自动注入JavaMailSender实例。JavaMailSender是 Spring 提供的用于发送邮件的核心接口,它封装了发送邮件的各种操作,我们无需关注底层的邮件发送细节,通过这个接口就能轻松实现邮件发送功能。

  • @Value\(\&\#34;$\{spring\.mail\.username\}\&\#34;\)注解:从配置文件中读取spring\.mail\.username属性的值,并将其注入到from变量中。这个值就是我们在配置文件中设置的发送邮件的邮箱账号,在发送邮件时作为发件人地址。

  • sendSimpleMail方法:这个方法用于发送简单文本邮件。首先创建一个SimpleMailMessage对象,它是 Spring 提供的用于表示简单邮件消息的类。然后通过调用message\.setFrom\(from\)方法设置发件人地址,message\.setTo\(to\)方法设置收件人邮箱,message\.setSubject\(subject\)方法设置邮件主题,message\.setText\(content\)方法设置邮件内容。最后,调用javaMailSender\.send\(message\)方法发送邮件,JavaMailSendersend方法会根据我们设置的邮件消息,与邮件服务器进行交互,将邮件发送出去。

发送不同类型邮件

发送 HTML 邮件

有时候,我们需要发送带有格式的邮件,这时就可以使用 HTML 邮件。在MailService类中添加如下方法:

java 复制代码
import org.springframework.mail.javamail.MimeMessageHelper;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;

/**
 * 发送HTML邮件
 * @param to 收件人邮箱
 * @param subject 邮件主题
 * @param htmlContent HTML格式的邮件内容
 */
public void sendHtmlMail(String to, String subject, String htmlContent) {
    try {
        MimeMessage message = javaMailSender.createMimeMessage();
        MimeMessageHelper helper = new MimeMessageHelper(message, true);
        helper.setFrom(from);
        helper.setTo(to);
        helper.setSubject(subject);
        helper.setText(htmlContent, true);
        javaMailSender.send(message);
    } catch (MessagingException e) {
        e.printStackTrace();
    }
}

在这段代码中,我们使用了MimeMessageMimeMessageHelper来创建和设置 HTML 邮件。MimeMessage是 JavaMail API 中用于表示复杂邮件消息的类,它支持多种内容类型,包括 HTML。MimeMessageHelper是 Spring 提供的一个辅助类,用于简化MimeMessage的创建和设置过程。通过MimeMessageHelper的构造函数new MimeMessageHelper\(message, true\),第二个参数true表示邮件内容是多部分的,支持 HTML 格式。然后通过helper\.setText\(htmlContent, true\)方法设置 HTML 格式的邮件内容,第二个参数true表示内容是 HTML 格式。这样,接收方收到的邮件就会以 HTML 格式进行渲染,展示出丰富的样式和格式。

发送带附件邮件

如果需要发送带附件的邮件,可以在MailService类中添加如下方法:

java 复制代码
import org.springframework.core.io.FileSystemResource;
import java.io.File;

/**
 * 发送带附件的邮件
 * @param to 收件人邮箱
 * @param subject 邮件主题
 * @param content 邮件内容
 * @param filePath 附件文件路径
 */
public void sendAttachmentsMail(String to, String subject, String content, String filePath) {
    try {
        MimeMessage message = javaMailSender.createMimeMessage();
        MimeMessageHelper helper = new MimeMessageHelper(message, true);
        helper.setFrom(from);
        helper.setTo(to);
        helper.setSubject(subject);
        helper.setText(content);

        FileSystemResource file = new FileSystemResource(new File(filePath));
        String fileName = file.getFilename();
        helper.addAttachment(fileName, file);

        javaMailSender.send(message);
    } catch (MessagingException e) {
        e.printStackTrace();
    }
}

这里,我们同样使用MimeMessageMimeMessageHelper来创建邮件。通过FileSystemResource类加载附件文件,它是 Spring 提供的用于访问文件系统资源的类。然后调用helper\.addAttachment\(fileName, file\)方法将附件添加到邮件中,fileName是附件的文件名,file是文件资源对象。这样,接收方在收到邮件时,就可以看到并下载附件。在使用这个方法时,要注意filePath路径的正确性,确保文件存在且具有正确的访问权限。如果文件路径错误或者没有访问权限,会导致附件添加失败,邮件发送也可能会失败 。

发送内嵌图片邮件

有时我们希望在邮件正文中直接显示图片,而不是作为附件,这就需要发送内嵌图片的邮件。在MailService类中添加如下方法:

java 复制代码
/**
 * 发送内嵌图片的邮件
 * @param to 收件人邮箱
 * @param subject 邮件主题
 * @param content 邮件内容,需要包含类似 <img src="cid:rscId"> 的占位符
 * @param rscPath 图片文件路径
 * @param rscId 图片资源ID,用于在邮件内容中引用
 */
public void sendInlineResourceMail(String to, String subject, String content, String rscPath, String rscId) {
    try {
        MimeMessage message = javaMailSender.createMimeMessage();
        MimeMessageHelper helper = new MimeMessageHelper(message, true);
        helper.setFrom(from);
        helper.setTo(to);
        helper.setSubject(subject);
        helper.setText(content, true);

        FileSystemResource res = new FileSystemResource(new File(rscPath));
        helper.addInline(rscId, res);

        javaMailSender.send(message);
    } catch (MessagingException e) {
        e.printStackTrace();
    }
}

在这个方法中,content参数是邮件的 HTML 内容,需要包含\&lt;img src=\&\#34;cid:rscId\&\#34;\&gt;这样的占位符,其中rscId是图片的资源 ID。通过helper\.addInline\(rscId, res\)方法将图片添加为内嵌资源,rscId要与邮件内容中的cid值一致,这样邮件客户端在解析邮件内容时,就能正确显示图片。rscPath是图片文件的路径,同样要确保路径正确且文件可访问。例如,如果图片文件在项目的src/main/resources/static/images目录下,文件名为logo\.jpgrscId设置为logo,那么邮件内容中可以这样写:\&lt;img src=\&\#34;cid:logo\&\#34;\&gt;rscPath则为src/main/resources/static/images/logo\.jpg

常见问题及解决

在搭建和使用 Spring Boot 邮件发送系统的过程中,可能会遇到一些问题,下面为大家列举一些常见问题及解决方法。

授权失败

  • 问题描述:在配置好邮件服务器信息和授权码后,发送邮件时提示 "Authentication failed"(认证失败)。

  • 可能原因

    • 授权码错误:可能是在配置文件中填写的授权码不正确,或者授权码已过期。例如,在获取 QQ 邮箱授权码时,操作失误导致复制的授权码有误。

    • 未开启 SMTP 服务:如果没有在邮箱中开启 SMTP 服务,即使填写了正确的授权码也无法通过认证。以 163 邮箱为例,需要登录邮箱后在设置中手动开启 SMTP 服务。

  • 解决方法

    • 仔细检查配置文件中spring\.mail\.password配置项,确保填写的是正确的授权码。可以回到邮箱设置页面,重新获取授权码并更新到配置文件中。

    • 登录邮箱,确认 SMTP 服务已开启。如果未开启,按照邮箱的操作指南开启 SMTP 服务。

连接超时

  • 问题描述:发送邮件时,出现 "Couldn&#39;t connect to host, port"(无法连接到主机和端口)或者 "connection timeout"(连接超时)的错误提示。

  • 可能原因

    • 网络问题:本地网络不稳定,无法正常连接到邮件服务器;或者服务器所在网络环境存在限制,禁止访问邮件服务器的端口。比如在公司网络中,可能因为防火墙策略限制了对特定端口的访问。

    • 配置错误:邮件服务器地址或端口配置错误。例如,将 QQ 邮箱的 SMTP 服务器地址写错为 "smtp.q.com",或者将端口号写错。

  • 解决方法

    • 检查网络连接,确保本地网络正常。可以尝试访问其他网站或者使用 ping 命令测试与邮件服务器的连通性。如果是服务器所在网络有限制,联系网络管理员,开放对邮件服务器端口(如 QQ 邮箱的 587 端口)的访问权限。

    • 仔细核对配置文件中的spring\.mail\.hostspring\.mail\.port配置项,确保填写的是正确的邮件服务器地址和端口。

中文乱码

  • 问题描述:发送的邮件中,主题或内容包含中文时,接收方收到的邮件中文显示为乱码。

  • 可能原因

    • 编码设置问题:在发送邮件时,没有正确设置邮件的编码格式。例如,在创建邮件消息时,没有指定 UTF - 8 编码。

    • 环境编码不一致:开发环境和运行环境的默认编码不一致。比如,开发环境是 UTF - 8 编码,而运行环境是 GBK 编码。

  • 解决方法

    • 在发送邮件的代码中,确保设置了正确的编码格式。对于简单文本邮件,可以在SimpleMailMessage中设置编码,如message\.setEncoding\(\&\#34;UTF\-8\&\#34;\);;对于 HTML 邮件,在MimeMessageHelper中设置编码,如helper\.setText\(htmlContent, true, \&\#34;UTF\-8\&\#34;\);

    • 统一开发环境和运行环境的编码,建议都使用 UTF - 8 编码。如果是在服务器上运行,可以通过修改服务器的配置文件来设置默认编码为 UTF - 8 。

优化与拓展

异步发送邮件

在实际应用中,发送邮件可能是一个相对耗时的操作,如果在主线程中同步发送邮件,可能会导致接口响应缓慢,影响用户体验。特别是在高并发场景下,大量的邮件发送任务会占用主线程的资源,导致系统性能下降。例如,在电商平台的促销活动中,可能需要向大量用户发送活动通知邮件,如果采用同步发送,用户在注册或下单等操作时,可能会因为邮件发送的耗时,而长时间等待页面响应。

为了解决这个问题,Spring Boot 提供了异步任务的支持,我们可以通过在邮件发送方法上添加@Async注解来实现异步发送邮件。首先,在 Spring Boot 的主类上添加@EnableAsync注解,开启异步任务支持,如下所示:

java 复制代码
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableAsync;

@SpringBootApplication
@EnableAsync
public class MailSenderSystemApplication {
    public static void main(String[] args) {
        SpringApplication.run(MailSenderSystemApplication.class, args);
    }
}

然后,在MailService类的邮件发送方法上添加@Async注解,以sendSimpleMail方法为例:

java 复制代码
import org.springframework.scheduling.annotation.Async;

@Service
public class MailService {
    // 其他代码不变

    @Async
    public void sendSimpleMail(String to, String subject, String content) {
        SimpleMailMessage message = new SimpleMailMessage();
        message.setFrom(from);
        message.setTo(to);
        message.setSubject(subject);
        message.setText(content);
        javaMailSender.send(message);
    }
}

这样,当调用sendSimpleMail方法时,邮件发送任务会被提交到一个异步线程池中执行,主线程不会等待邮件发送完成,而是立即返回,从而大大提高了系统的响应性能。在实际使用中,我们还可以根据业务需求,自定义异步线程池的参数,如核心线程数、最大线程数、队列容量等,以优化系统性能。例如:

java 复制代码
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.Executor;

@Configuration
@EnableAsync
public class AsyncConfig {

    @Bean(name = "taskExecutor")
    public Executor taskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(5); // 核心线程数
        executor.setMaxPoolSize(10); // 最大线程数
        executor.setQueueCapacity(25); // 队列容量
        executor.setThreadNamePrefix("MailAsync-"); // 线程名前缀
        executor.initialize();
        return executor;
    }
}

在上述配置中,我们创建了一个名为taskExecutor的线程池,核心线程数为 5,最大线程数为 10,队列容量为 25。当有邮件发送任务时,会优先使用核心线程执行,如果核心线程都在忙碌,任务会被放入队列中等待执行,如果队列也满了,会创建新的线程(最多创建到最大线程数 10)来执行任务。通过这种方式,我们可以有效地控制异步任务的执行,提高系统的并发处理能力。

邮件模板引擎集成

在很多场景下,我们需要发送内容动态变化的邮件,比如用户注册成功后的欢迎邮件,其中包含用户的姓名和注册时间;或者订单状态变更通知邮件,包含订单号和新的订单状态。如果每次都手动拼接邮件内容,不仅代码复杂,而且维护困难。这时,我们可以集成模板引擎来动态生成邮件内容,提高邮件发送的灵活性。

FreeMarker 是一个强大的模板引擎,它可以与 Spring Boot 完美集成。首先,在pom\.xml文件中添加 FreeMarker 的依赖:

xml 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>

然后,在src/main/resources目录下创建templates文件夹,用于存放 FreeMarker 模板文件。例如,创建一个名为welcome\.ftl的模板文件,内容如下:

html 复制代码
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>欢迎邮件</title>
</head>
<body>
    <h1>亲爱的${userName},欢迎注册我们的平台!</h1>
    <p>注册时间:${registerTime}</p>
    <p>感谢您的加入,希望您在这里有愉快的体验!</p>
</body>
</html>

在上述模板中,$\{userName\}$\{registerTime\}是占位符,在生成邮件内容时会被替换为实际的值。接下来,在MailService类中添加发送模板邮件的方法:

java 复制代码
import freemarker.template.Configuration;
import freemarker.template.Template;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;
import org.springframework.ui.freemarker.FreeMarkerTemplateUtils;
import javax.mail.internet.MimeMessage;
import java.util.Map;

@Service
public class MailService {
    // 其他代码不变

    @Autowired
    private Configuration freemarkerConfiguration;

    /**
     * 发送模板邮件
     * @param to 收件人邮箱
     * @param subject 邮件主题
     * @param templateName 模板文件名
     * @param model 模板数据模型
     */
    public void sendTemplateMail(String to, String subject, String templateName, Map<String, Object> model) {
        try {
            Template template = freemarkerConfiguration.getTemplate(templateName);
            String htmlContent = FreeMarkerTemplateUtils.processTemplateIntoString(template, model);

            MimeMessage message = javaMailSender.createMimeMessage();
            MimeMessageHelper helper = new MimeMessageHelper(message, true, "UTF-8");
            helper.setFrom(from);
            helper.setTo(to);
            helper.setSubject(subject);
            helper.setText(htmlContent, true);

            javaMailSender.send(message);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

在上述方法中,Configuration是 FreeMarker 的配置类,通过@Autowired注入。sendTemplateMail方法接收模板文件名和模板数据模型,首先通过freemarkerConfiguration\.getTemplate\(templateName\)获取模板,然后使用FreeMarkerTemplateUtils\.processTemplateIntoString\(template, model\)方法将模板和数据模型合并,生成 HTML 格式的邮件内容。最后,使用MimeMessageHelper将邮件内容设置到邮件消息中并发送。

使用时,我们可以这样调用:

java 复制代码
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;

@RestController
public class MailController {

    @Autowired
    private MailService mailService;

    @GetMapping("/sendTemplateMail")
    public String sendTemplateMail(@RequestParam String to, @RequestParam String userName, @RequestParam String registerTime) {
        String subject = "欢迎注册";
        String templateName = "welcome.ftl";

        Map<String, Object> model = new HashMap<>();
        model.put("userName", userName);
        model.put("registerTime", registerTime);

        mailService.sendTemplateMail(to, subject, templateName, model);
        return "模板邮件发送成功";
    }
}

在上述代码中,我们创建了一个MailController,并定义了一个sendTemplateMail方法,用于接收用户输入的收件人邮箱、用户名和注册时间,然后调用MailServicesendTemplateMail方法发送模板邮件。通过这种方式,我们可以根据不同的业务场景,灵活地生成邮件内容,提高邮件发送的效率和准确性。

相关推荐
苏三说技术1 小时前
Claude Code从失控到起飞,只用了这些技巧
后端
长栎2 小时前
写 for 循环写了十年,你却从没用过迭代器模式最狠的那一面
后端
LiaCode2 小时前
Redis 在生产项目的使用
前端·后端
用户559822481222 小时前
Docker Compose Down 导致容器数据误删——ext4 日志恢复全记录
后端
LiaCode2 小时前
一天学完 redis 的爽翻版核心知识总结
前端·后端
大刚测试开发实战2 小时前
如何内网穿透访问本地私有化部署的TestHub
前端·后端·github
xiaodaoluanzha3 小时前
迄今為止,最簡單的編程語言 Nolang
前端·后端
Csvn3 小时前
Docker 容器管理入门 — 从镜像到容器编排
后端
用户762352425913 小时前
ShardingJDBC
后端
行者全栈架构师3 小时前
IDEA 中 Maven 项目的 15 个红色报错快速解决方法
java·后端