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

相关推荐
TinyMemory14 分钟前
Java 面向对象核心入门(九):方法重写 Override|彻底分清重载与重写
java·面向对象·override·方法重写·重载与重写
LaughingZhu22 分钟前
Product Hunt 每日热榜 | 2026-09-08
java·ide·深度学习·百度·intellij-idea
IT枫斗者枫哥35 分钟前
Java 文件导出:写完了,为什么还不能标记成功?
java
xixingzhe235 分钟前
SpringBoot DDD 实战入门文档
spring boot·spring·ddd
陈皮波比茶41 分钟前
java笔记-typora快捷键
java
蚂蚁雅嘿1 小时前
maven标签日常总结
java·maven
洋不写bug1 小时前
二叉树(二) 常见基础操作解析|结点数、树高、查找结点、判断完全二叉树
java·开发语言·数据结构·完全二叉树·二叉树结点数·树高·查找结点
菠萝加点糖1 小时前
Maven 坐标系统说明
java·maven
hm宋1 小时前
Canal 升级 jar 包操作文档(以升级 FastJSON 为例)
java·canal·jar
后台模板学习1 小时前
学习的心态高频面试题
java·数据库·学习