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\.enable和spring\.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\)方法发送邮件,JavaMailSender的send方法会根据我们设置的邮件消息,与邮件服务器进行交互,将邮件发送出去。
发送不同类型邮件
发送 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();
}
}
在这段代码中,我们使用了MimeMessage和MimeMessageHelper来创建和设置 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();
}
}
这里,我们同样使用MimeMessage和MimeMessageHelper来创建邮件。通过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 内容,需要包含\<img src=\&\#34;cid:rscId\&\#34;\>这样的占位符,其中rscId是图片的资源 ID。通过helper\.addInline\(rscId, res\)方法将图片添加为内嵌资源,rscId要与邮件内容中的cid值一致,这样邮件客户端在解析邮件内容时,就能正确显示图片。rscPath是图片文件的路径,同样要确保路径正确且文件可访问。例如,如果图片文件在项目的src/main/resources/static/images目录下,文件名为logo\.jpg,rscId设置为logo,那么邮件内容中可以这样写:\<img src=\&\#34;cid:logo\&\#34;\>,rscPath则为src/main/resources/static/images/logo\.jpg。
常见问题及解决
在搭建和使用 Spring Boot 邮件发送系统的过程中,可能会遇到一些问题,下面为大家列举一些常见问题及解决方法。
授权失败
-
问题描述:在配置好邮件服务器信息和授权码后,发送邮件时提示 "Authentication failed"(认证失败)。
-
可能原因:
-
授权码错误:可能是在配置文件中填写的授权码不正确,或者授权码已过期。例如,在获取 QQ 邮箱授权码时,操作失误导致复制的授权码有误。
-
未开启 SMTP 服务:如果没有在邮箱中开启 SMTP 服务,即使填写了正确的授权码也无法通过认证。以 163 邮箱为例,需要登录邮箱后在设置中手动开启 SMTP 服务。
-
-
解决方法:
-
仔细检查配置文件中
spring\.mail\.password配置项,确保填写的是正确的授权码。可以回到邮箱设置页面,重新获取授权码并更新到配置文件中。 -
登录邮箱,确认 SMTP 服务已开启。如果未开启,按照邮箱的操作指南开启 SMTP 服务。
-
连接超时
-
问题描述:发送邮件时,出现 "Couldn't connect to host, port"(无法连接到主机和端口)或者 "connection timeout"(连接超时)的错误提示。
-
可能原因:
-
网络问题:本地网络不稳定,无法正常连接到邮件服务器;或者服务器所在网络环境存在限制,禁止访问邮件服务器的端口。比如在公司网络中,可能因为防火墙策略限制了对特定端口的访问。
-
配置错误:邮件服务器地址或端口配置错误。例如,将 QQ 邮箱的 SMTP 服务器地址写错为 "smtp.q.com",或者将端口号写错。
-
-
解决方法:
-
检查网络连接,确保本地网络正常。可以尝试访问其他网站或者使用 ping 命令测试与邮件服务器的连通性。如果是服务器所在网络有限制,联系网络管理员,开放对邮件服务器端口(如 QQ 邮箱的 587 端口)的访问权限。
-
仔细核对配置文件中的
spring\.mail\.host和spring\.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方法,用于接收用户输入的收件人邮箱、用户名和注册时间,然后调用MailService的sendTemplateMail方法发送模板邮件。通过这种方式,我们可以根据不同的业务场景,灵活地生成邮件内容,提高邮件发送的效率和准确性。