在springboot 项目中,邮件发送是不可或缺的基础功能,广泛应用于用户注册验证、密码找回、系统告警、订单通知等核心场景。springboot 提供的 spring-boot-starter-mail 组件,基于 javamail 完成了底层协议封装与自动化配置,无需开发者手动处理 smtp 连接、编码适配等繁琐操作。
一、核心基础
- 协议说明:发送邮件的核心依赖是smtp 协议(simple mail transfer protocol,简单邮件传输协议),负责将邮件从发件人服务器传递到收件人服务器。推荐使用加密端口 587(tls 加密),安全性更高,可有效避免邮件被拦截或篡改;非加密端口 25 因易被垃圾邮件利用,多数服务器已屏蔽,不推荐使用。
- 核心组件详解(spring 自动注入,无需手动实例化):
javamailsender:邮件发送的核心接口,封装了邮件发送的所有核心操作(连接服务器、发送邮件、关闭连接等),springboot 会根据配置文件自动创建实例。simplemailmessage:专门用于发送纯文本邮件的工具类,用法简洁,仅支持文本内容、收件人、主题等基础配置,不支持样式、附件。mimemessagehelper:复杂邮件的辅助工具类,简化 html 邮件、带附件邮件、多收件人(抄送/密送)等场景的配置,解决中文乱码、样式解析等常见问题。
- 核心应用场景:
- 纯文本邮件:适用于系统告警、简单通知(如服务器异常提醒、操作日志通知),特点是简洁、发送速度快,无需复杂样式。
- html 富文本邮件:适用于用户交互类场景(如注册验证码、密码找回、订单通知、活动营销),支持文字样式、图片、链接、表格等,提升用户体验,是实际开发中最常用的邮件类型。
二、环境准备(关键步骤,缺一不可)
发送邮件前,必须开启发件人邮箱的 smtp 服务,并获取「授权码」—— 授权码是第三方应用(如 springboot 项目)访问邮箱的专用密钥,不同于邮箱登录密码,目的是保障邮箱账号安全,防止密码泄露。不同邮箱的开启方式略有差异,以下是最常用的两种邮箱操作步骤,详细且可直接对照操作。
1. qq邮箱
1. 登录 qq 邮箱网页版(https://mail.qq.com/),点击顶部导航栏的「设置」,选择左侧「账户」选项;
2. 下拉页面,找到「pop3/imap/smtp/exchange/carddav/caldav服务」模块,点击「开启pop3/smtp服务」;
3. 根据提示,用绑定 qq 邮箱的手机发送短信验证,验证通过后,系统会自动生成一串授权码,复制并保存(建议存放在配置文件中,丢失可重新生成);
4. 记住 qq 邮箱的 smtp 服务器地址:smtp.qq.com,推荐使用端口:587(tls 加密),若 587 端口不可用,可切换为 465(ssl 加密)。
2. 163邮箱
1. 登录 163 邮箱网页版(https://mail.163.com/),点击顶部「设置」,选择「pop3/smtp/imap」选项;
2. 在「smtp 服务」模块,点击「开启」,若未设置过授权码,需先设置授权码(建议设置复杂密码,与邮箱登录密码区分开),设置完成后保存;
3. 163 邮箱的 smtp 服务器地址:smtp.163.com,推荐端口:587(tls 加密),465(ssl 加密)同样支持,可根据服务器环境选择。
三、springboot 集成配置
springboot 对邮件发送进行了自动化配置,仅需引入核心依赖、配置相关参数,即可快速集成,无需编写额外的配置类(特殊场景除外)。
1. 核心依赖(pom.xml)
仅需引入邮件核心 starter,lombok 用于简化代码(可选但推荐,可避免编写 getter/setter、日志输出等冗余代码),无需引入其他额外依赖。
<!-- springboot 邮件发送核心依赖,自动引入 javamail 相关依赖 -->
<dependency>
<groupid>org.springframework.boot</groupid>
<artifactid>spring-boot-starter-mail</artifactid>
</dependency>
<!-- 可选:lombok,简化代码,无需写getter/setter、log日志等 -->
<dependency>
<groupid>org.projectlombok</groupid>
<artifactid>lombok</artifactid>
<optional>true</optional> <!-- 可选依赖,不影响其他模块 -->
</dependency>
<!-- 可选:spring-boot-starter-web,用于提供测试接口,若项目已引入可忽略 -->
<dependency>
<groupid>org.springframework.boot</groupid>
<artifactid>spring-boot-starter-web</artifactid>
</dependency>2. 单邮箱配置(application.yml)
配置发件人邮箱、授权码、smtp 服务器地址、编码格式、超时时间等核心参数,注释清晰,可直接替换为自己的邮箱信息,避免因配置错误导致发送失败。
spring:
mail:
# 发件人邮箱地址(qq/163/企业邮箱均可,需与下方smtp地址对应)
username: 123456@qq.com
# 授权码(不是邮箱登录密码!是上一步获取的第三方应用授权码)
password: abcdefghijklmnop
# smtp 服务器地址(对应邮箱,不可写错,qq邮箱:smtp.qq.com;163邮箱:smtp.163.com)
host: smtp.qq.com
# 编码格式,固定为 utf-8,避免邮件标题、内容出现中文乱码
default-encoding: utf-8
# 额外配置:解决超时、加密、认证等问题,生产环境必配
properties:
mail:
smtp:
# 必须开启 smtp 认证(true),否则邮箱服务器会拒绝发送请求
auth: true
# 开启 tls 加密,提升邮件发送安全性,避免邮件被拦截
starttls:
enable: true
required: true # 强制使用 tls 加密
# 邮件发送端口,推荐 587(tls),465(ssl)也可,需与加密方式对应
port: 587
# 超时设置(单位:毫秒),避免网络波动、服务器响应慢导致发送超时
timeout: 10000 # 邮件发送超时时间
connectiontimeout: 10000 # 连接服务器超时时间
writetimeout: 10000 # 写入数据超时时间
# 日志配置(可选,用于排查邮件发送问题,开发环境建议开启)
logging:
level:
# 开启 spring 邮件发送相关日志,debug 级别可查看完整发送流程
org.springframework.mail: debug
# 开启自定义邮件相关日志(替换为自己的包名)
com.example.mail: info四、核心代码
采用「工具类封装 + 接口测试」的模式,将邮件发送逻辑封装为通用工具类,便于在项目中复用;提供测试接口,可快速验证邮件发送功能,同时补充异常处理、日志输出,确保代码的健壮性。
1. 封装邮件工具类 mailutil
整合纯文本邮件、html 富文本邮件的发送方法,支持单收件人、多收件人,添加异常捕获和日志记录,避免发送失败影响主流程;同时补充代码注释,便于后续维护和修改。
import lombok.requiredargsconstructor;
import lombok.extern.slf4j.slf4j;
import org.springframework.beans.factory.annotation.value;
import org.springframework.mail.simplemailmessage;
import org.springframework.mail.javamail.javamailsender;
import org.springframework.mail.javamail.mimemessagehelper;
import org.springframework.stereotype.component;
import javax.mail.messagingexception;
import javax.mail.internet.mimemessage;
/**
* 邮件发送工具类(聚焦文本、html 两种常用邮件,适配多场景复用)
* 注:工具类使用 @component 注解,交给 spring 管理,可在 service、controller 中直接注入使用
*/
@slf4j // lombok 注解,自动生成 log 日志对象,无需手动创建
@component
@requiredargsconstructor // lombok 注解,自动注入构造方法,无需写 @autowired
public class mailutil {
// 核心发送接口,springboot 自动根据配置文件创建实例,直接注入即可
private final javamailsender javamailsender;
// 从 application.yml 配置文件中读取发件人邮箱,无需硬编码
@value("${spring.mail.username}")
private string defaultfrommail;
// 1. 发送纯文本邮件(重载方法,支持单收件人、多收件人,适配不同场景)
/**
* 单收件人文本邮件
* @param to 收件人邮箱地址(单个)
* @param subject 邮件主题
* @param content 邮件纯文本内容
*/
public void sendtextmail(string to, string subject, string content) {
sendtextmail(new string[]{to}, subject, content);
}
/**
* 多收件人文本邮件
* @param to 收件人邮箱地址数组(多个)
* @param subject 邮件主题
* @param content 邮件纯文本内容
*/
public void sendtextmail(string[] to, string subject, string content) {
try {
// 创建纯文本邮件实例
simplemailmessage message = new simplemailmessage();
message.setfrom(defaultfrommail); // 设置发件人(从配置文件读取,避免硬编码)
message.setto(to); // 设置收件人(可单个、可多个)
message.setsubject(subject); // 设置邮件主题
message.settext(content); // 设置邮件纯文本内容
javamailsender.send(message); // 发送邮件
log.info("纯文本邮件发送成功,收件人:{},邮件主题:{}", string.join(",", to), subject);
} catch (exception e) {
// 捕获所有异常,记录日志,避免影响主流程
log.error("纯文本邮件发送失败,收件人:{},邮件主题:{},异常信息:{}",
string.join(",", to), subject, e.getmessage(), e);
// 抛出运行时异常,由调用方根据业务需求处理(如重试、返回错误信息)
throw new runtimeexception("文本邮件发送失败,请稍后重试", e);
}
}
// 2. 发送 html 富文本邮件(重载方法,支持单收件人、多收件人,带样式)
/**
* 单收件人 html 邮件
* @param to 收件人邮箱地址(单个)
* @param subject 邮件主题
* @param htmlcontent html 格式的邮件内容(支持样式、链接、图片等)
* @throws messagingexception 邮件发送相关异常(如配置错误、网络问题)
*/
public void sendhtmlmail(string to, string subject, string htmlcontent) throws messagingexception {
sendhtmlmail(new string[]{to}, subject, htmlcontent);
}
/**
* 多收件人 html 邮件
* @param to 收件人邮箱地址数组(多个)
* @param subject 邮件主题
* @param htmlcontent html 格式的邮件内容(支持样式、链接、图片等)
* @throws messagingexception 邮件发送相关异常(如配置错误、网络问题)
*/
public void sendhtmlmail(string[] to, string subject, string htmlcontent) throws messagingexception {
try {
// 创建复杂邮件实例(支持 html、附件、内嵌图片等)
mimemessage message = javamailsender.createmimemessage();
// 创建辅助类,第一个参数:邮件实例;第二个参数:true 表示支持多部分内容(如 html);第三个参数:编码格式
mimemessagehelper helper = new mimemessagehelper(message, true, "utf-8");
helper.setfrom(defaultfrommail); // 发件人
helper.setto(to); // 收件人(多收件人传入数组)
helper.setsubject(subject); // 邮件主题
// 第二个参数 true:开启 html 解析,否则会将 html 标签显示为纯文本
helper.settext(htmlcontent, true);
javamailsender.send(message); // 发送邮件
log.info("html 邮件发送成功,收件人:{},邮件主题:{}", string.join(",", to), subject);
} catch (messagingexception e) {
log.error("html 邮件发送失败,收件人:{},邮件主题:{},异常信息:{}",
string.join(",", to), subject, e.getmessage(), e);
// 抛出异常,由调用方处理(如返回错误信息、重试)
throw e;
}
}
}2. 测试接口 controller
提供 rest 接口,可通过 postman、浏览器直接调用测试,覆盖单收件人、多收件人、文本邮件、html 邮件等核心场景;接口参数清晰,注释详细,实际项目中可直接复用,或根据业务需求修改。
import lombok.requiredargsconstructor;
import org.springframework.web.bind.annotation.getmapping;
import org.springframework.web.bind.annotation.requestmapping;
import org.springframework.web.bind.annotation.requestparam;
import org.springframework.web.bind.annotation.restcontroller;
import javax.mail.messagingexception;
/**
* 邮件发送测试接口(实际项目中可整合到 service 层,结合业务场景调用)
* 接口采用 get 请求,方便快速测试;正式环境可根据需求改为 post 请求
*/
@restcontroller
@requestmapping("/mail") // 接口统一前缀,便于管理
@requiredargsconstructor
public class mailcontroller {
// 注入邮件工具类,直接调用发送方法
private final mailutil mailutil;
// 测试:发送纯文本邮件(单收件人,get请求,方便快速测试)
@getmapping("/send/text")
public string sendtextmail(
@requestparam string to, // 收件人邮箱地址(必填)
@requestparam string subject, // 邮件主题(必填)
@requestparam string content // 邮件纯文本内容(必填)
) {
mailutil.sendtextmail(to, subject, content);
return "纯文本邮件发送成功!";
}
// 测试:发送 html 富文本邮件(单收件人,get请求,方便快速测试)
@getmapping("/send/html")
public string sendhtmlmail(
@requestparam string to, // 收件人邮箱地址(必填)
@requestparam string subject // 邮件主题(必填)
) throws messagingexception {
// 构建 html 内容(支持样式、链接、表格等,可根据实际业务需求修改)
// 示例:模拟用户注册验证邮件,包含验证码、链接等核心元素
string htmlcontent = "<!doctype html>" +
"<html lang='zh-cn'>" +
"<head><meta charset='utf-8'><title>" + subject + "</title></head>" +
"<body style='font-family: \"microsoft yahei\", sans-serif;'>" +
"<div style='width: 600px; margin: 0 auto; padding: 20px; border: 1px solid #eee; border-radius: 5px;'>" +
"<h2 style='color: #1e90ff; text-align: center; margin-bottom: 20px;'>用户注册验证</h2>" +
"<p style='font-size: 14px; line-height: 1.5;'>尊敬的用户,您好!</p>" +
"<p style='font-size: 14px; line-height: 1.5;'>您正在进行注册验证,本次验证码为:</p>" +
"<div style='font-size: 24px; color: #ff4500; font-weight: bold; text-align: center; margin: 15px 0;'>123456</div>" +
"<p style='font-size: 14px; line-height: 1.5;'>验证码有效期为 5 分钟,请在有效期内完成验证。</p>" +
"<p style='font-size: 14px; line-height: 1.5;'>若您未发起注册操作,请忽略此邮件,感谢您的支持!</p>" +
"<p style='font-size: 12px; color: #999; margin-transform: translatey( 30px; text-align: center;'>此为系统自动发送邮件,请勿回复</p>" +
"</div>" +
"</body></html>";
mailutil.sendhtmlmail(to, subject, htmlcontent);
return "html 邮件发送成功!";
}
// 测试:多收件人发送纯文本邮件(实际场景常用,如批量通知)
@getmapping("/send/text/batch")
public string sendbatchtextmail(
@requestparam string[] to, // 多收件人邮箱地址数组(必填,格式:xxx@qq.com,xxx@163.com)
@requestparam string subject, // 邮件主题(必填)
@requestparam string content // 邮件纯文本内容(必填)
) {
mailutil.sendtextmail(to, subject, content);
return "多收件人文本邮件发送成功!共发送 " + to.length + " 个收件人";
}
// 测试:多收件人发送 html 邮件(实际场景常用,如批量营销、通知)
@getmapping("/send/html/batch")
public string sendbatchhtmlmail(
@requestparam string[] to,
@requestparam string subject
) throws messagingexception {
// 复用注册验证 html 模板,可根据实际需求修改
string htmlcontent = "<!doctype html>" +
"<html lang='zh-cn'>" +
"<body style='font-family: \"microsoft yahei\", sans-serif;'>" +
"<h2 style='color: #1e90ff; text-align: center;'>批量通知邮件</h2>" +
"<p style='font-size: 14px;'>各位用户,您好!本次批量通知内容如下:</p>" +
"<p style='font-size: 14px; color: #333;'>系统将于今晚 23:00 进行升级维护,维护期间可能无法正常使用,敬请谅解!</p>" +
"<p style='font-size: 12px; color: #999; margin-top: 20px;'>此为系统批量发送邮件,请勿回复</p>" +
"</body></html>";
mailutil.sendhtmlmail(to, subject, htmlcontent);
return "多收件人html邮件发送成功!共发送 " + to.length + " 个收件人";
}
}五、关键注意事项
- 授权码是核心,必须填写正确,不可用邮箱登录密码替代,否则邮箱服务器会拒绝发送请求,导致发送失败;若授权码丢失,可重新在邮箱设置中生成。
- html 邮件必须开启
helper.settext(htmlcontent, true),第二个参数为 true 才会解析 html 样式,若设为 false,会将 html 标签显示为纯文本,失去样式效果。 - 测试时优先使用个人邮箱(qq/163),正式环境建议切换为企业邮箱,因为个人邮箱有发送频率限制(如 qq 邮箱单日发送上限约 50 封),企业邮箱无明显限制,稳定性更高。
- 若邮件发送失败,可开启日志 debug 级别,重点排查以下问题:授权码错误、smtp 服务器地址错误、端口错误、网络波动、邮箱 smtp 服务未开启。
- 多收件人发送时,直接传入字符串数组
string[] to即可,无需多次调用发送方法,工具类已做好适配,避免重复创建连接,提升发送效率。 - 中文乱码问题:确保配置文件中
default-encoding: utf-8,同时 mimemessagehelper 构造方法中指定编码为 utf-8,即可避免中文乱码。 - 异常处理:工具类中已捕获异常并记录日志,实际项目中可根据业务需求添加重试逻辑(如失败后重试 2-3 次),提升邮件发送成功率。
以上就是springboot邮件发送之文本邮件与html邮件的实现步骤的详细内容,更多关于springboot发送文本邮件与html邮件的资料请关注代码网其它相关文章!
发表评论