当前位置: 代码网 > it编程>编程语言>Java > SpringBoot邮件发送之文本邮件与HTML邮件的实现步骤

SpringBoot邮件发送之文本邮件与HTML邮件的实现步骤

2026年04月09日 Java 我要评论
在springboot 项目中,邮件发送是不可或缺的基础功能,广泛应用于用户注册验证、密码找回、系统告警、订单通知等核心场景。springboot 提供的 spring-boot-starter-ma

在springboot 项目中,邮件发送是不可或缺的基础功能,广泛应用于用户注册验证、密码找回、系统告警、订单通知等核心场景。springboot 提供的 spring-boot-starter-mail 组件,基于 javamail 完成了底层协议封装与自动化配置,无需开发者手动处理 smtp 连接、编码适配等繁琐操作。

一、核心基础

  1. 协议说明:发送邮件的核心依赖是smtp 协议(simple mail transfer protocol,简单邮件传输协议),负责将邮件从发件人服务器传递到收件人服务器。推荐使用加密端口 587(tls 加密),安全性更高,可有效避免邮件被拦截或篡改;非加密端口 25 因易被垃圾邮件利用,多数服务器已屏蔽,不推荐使用。
  2. 核心组件详解(spring 自动注入,无需手动实例化):
    • javamailsender:邮件发送的核心接口,封装了邮件发送的所有核心操作(连接服务器、发送邮件、关闭连接等),springboot 会根据配置文件自动创建实例。
    • simplemailmessage:专门用于发送纯文本邮件的工具类,用法简洁,仅支持文本内容、收件人、主题等基础配置,不支持样式、附件。
    • mimemessagehelper:复杂邮件的辅助工具类,简化 html 邮件、带附件邮件、多收件人(抄送/密送)等场景的配置,解决中文乱码、样式解析等常见问题。
  3. 核心应用场景:
    • 纯文本邮件:适用于系统告警、简单通知(如服务器异常提醒、操作日志通知),特点是简洁、发送速度快,无需复杂样式。
    •  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邮件的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com