SpringBoot Java邮件发送工具类

1、引入依赖 pom.xml

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

2、增加配置 application.yml

xml 复制代码
spring:
	mail:
        # 发送邮件的服务器,笔者这里使用的 QQ 邮件
        host: smtp.qq.com
        username: ***@qq.com
        password: ***
        properties.mail.smtp.auth: true
        properties.mail.smtp.starttls.enable: true
        default-encoding: utf-8

3、发送邮件工具类 SendMailUtils.java

java 复制代码
package com.company.mail.utils;

import com.company.common.utils.spring.SpringUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.mail.MailProperties;
import org.springframework.core.io.FileSystemResource;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;

import javax.mail.internet.MimeMessage;

/**
 * 发送邮件工具类
 *
 * @author ZhangJi
 */
@Slf4j
public class SendMailUtils {

    private SendMailUtils() {}

    private static final MailProperties MAIL_PROPERTIES;
    private static final JavaMailSender MAIL_SENDER;

    static {
        MAIL_PROPERTIES = SpringUtils.getBean(MailProperties.class);
        MAIL_SENDER = SpringUtils.getBean(JavaMailSender.class);
    }

    /**
     * 发送简单文本的邮件
     * @param target 目标邮箱
     * @param subject 标题
     * @param content 内容
     * @return 发送结果
     */
    public static boolean sendSimpleMail(String target, String subject, String content) {

        return sendHtmlMail(target, subject, content);
    }

    /**
     * 发送 html 的邮件
     * @param target 目标邮箱
     * @param subject 标题
     * @param html 内容
     * @return 发送结果
     */
    public static boolean sendHtmlMail(String target, String subject, String html) {

        return sendAffixMail(target, subject, html, null);
    }

    /**
     * 发送发票邮件
     * @param target 目标邮箱
     * @param subject 标题
     * @param filePath 发票附件
     * @return 发送结果
     */
    public static boolean sendInvoiceMail(String target, String subject, String filePath) {

        return sendAffixMail(target, subject, "<p>尊敬的用户您好:</p><p>您的发票已开出,请查收。</p>", new String[] {filePath});
    }

    /**
     * 发送带有附件的邮件
     * @param target 目标邮箱
     * @param subject 标题
     * @param content 内容
     * @param filePaths 附件列表
     * @return 结果
     */
    public static boolean sendAffixMail(String target, String subject, String content, String[] filePaths) {
        log.info("## Ready to send mail ...");
        MimeMessage mimeMessage = MAIL_SENDER.createMimeMessage();

        MimeMessageHelper mimeMessageHelper;
        try {
            mimeMessageHelper = new MimeMessageHelper(mimeMessage, true);
            // 邮件发送来源
            mimeMessageHelper.setFrom(MAIL_PROPERTIES.getUsername());
            // 邮件发送目标
            mimeMessageHelper.setTo(target);
            // 设置标题
            mimeMessageHelper.setSubject(subject);
            // 设置内容
            mimeMessageHelper.setText(content);

            // 添加附件
            if(null != filePaths && filePaths.length > 0) {
                for (int i = 0; i < filePaths.length; i++) {
                    FileSystemResource file = new FileSystemResource(filePaths[i]);
                    String fileName = "附件" + (i + 1) + "_" + file.getFile().getName();
                    mimeMessageHelper.addAttachment(fileName, file);
                }
            }

            MAIL_SENDER.send(mimeMessage);
            log.info("## Send the mail with enclosure success ...");
        } catch (Exception e) {
            log.error("Send html mail error: ", e);
            return false;
        }
        return true;
    }

    public static MailProperties getMailProperties() {
        return MAIL_PROPERTIES;
    }

    public static JavaMailSender getMailSender() {
        return MAIL_SENDER;
    }
}

4、测试类 MailTest.java

java 复制代码
package com.company.test;

import com.company.PlatformApplication;
import com.company.common.config.PlatformConfig;
import com.company.common.constant.Constants;
import com.company.mail.utils.SendMailUtils;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@Slf4j
@RunWith(SpringRunner.class)
@SpringBootTest(classes = PlatformApplication.class)
public class MailTest {

    @Test
    public void sendInvoiceMail() {
        String filePath = "/profile/upload/2026/04/10/20260410092201A001.png";
        filePath = filePath.contains("http")?filePath: filePath.replace(Constants.RESOURCE_PREFIX, PlatformConfig.getProfile());
        System.out.println(SendMailUtils.sendInvoiceMail("1661623520@qq.com", "发票开具通知", filePath));
    }
}

使用说明

对应的工具类,如:字符串等,换成自己的即可。

个人博客:紫琪软件工作室

邮箱留言:zhangji_59@qq.com

相关推荐
怎么比啊都是大神14 分钟前
关于==null、isEmpty()和StrUtil.isBlank()
java
唐青枫16 分钟前
Java Neo4j 实战指南:从图模型、Cypher 到 Spring Boot 关系查询
java
观远数据22 分钟前
从离线开发到实时同步:DataFlow如何支撑企业级数据治理闭环
java·windows·microsoft·excel
今天AI了吗1 小时前
Hermes Agent 搭建全流程:从本机试跑到可持续运行的个人 AI Agent
java·人工智能·python·学习·embedding
春卷同学2 小时前
032-关系型数据库在记账应用中的建模与查询优化
java·jvm·数据库
不平衡的叉叉树2 小时前
Springboot+Mockito简单使用单元测试
java·spring boot·单元测试
空中湖2 小时前
Spring AI 多模型接入实战:OpenAI、Ollama、通义千问切换只需改配置
java·人工智能·spring
tianyatest2 小时前
表格分类统计及排序
java·excel·暖通
山东点狮信息科技有限公司2 小时前
企业级开源OA系统推荐
vue.js·spring boot·性能优化·系统架构·开源
万亿少女的梦1682 小时前
基于Spring Boot与MySQL的乡镇群众服务系统设计与实现
java·spring boot·mysql·权限管理·前后端分离