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

相关推荐
未秃头的程序猿2 小时前
Java 26正式发布!这3个新特性,让代码量直接减半
java·后端·面试
用户298698530143 小时前
Word 文档文本查找与替换的 Java 实现方案
java·后端
阿哉3 小时前
Nacos 服务发现源码:藏在背后的两套事件机制,90%的人只讲了一半
java
咖啡八杯3 小时前
GoF设计模式——命令模式
java·设计模式·架构
AI人工智能_电脑小能手3 小时前
【大白话说Java面试题 第125题】【并发篇】第25题:说说 Java 线程的中断机制
java·后端·面试
Java内核笔记3 小时前
Spring Security 源码解析(六)无状态 JWT 实践:Session 共享与自定义过滤器
java·后端
荣码3 小时前
LangGraph多Agent协作:3个Agent干活比1个强,但我踩了4个坑
java·python
唐青枫5 小时前
Java 虚拟线程实战指南:从 Thread API 到 Spring Boot 高并发应用
java
白鲸开源21 小时前
Apache SeaTunnel Zeta Engine 的 Basic Auth 是怎么工作的?
java·vue.js·github
白鲸开源21 小时前
一文读懂DolphinScheduler插件机制:如何轻松扩展任务类型与数据源
java·架构·github