SpringBoot整合Email发送的完整配置和实现方法

 更新时间:2025年10月23日 10:02:59   作者:匆匆忙忙游刃有余  
本文详细介绍了在SpringBoot项目中配置和实现邮件发送功能的方法,涵盖普通文本邮件、HTML邮件、带附件邮件以及使用模板的邮件发送,需要的朋友可以参考下

引言

下面将详细介绍SpringBoot整合Email发送的完整配置和实现方法,包括普通文本邮件、HTML邮件、带附件邮件以及使用模板的邮件发送。

一、环境准备

1. 添加Maven依赖

pom.xml文件中添加邮件发送相关依赖:

<!-- 邮件发送核心依赖 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
</dependency>

<!-- 可选:如果需要使用FreeMarker模板 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>

2. 配置邮件服务器

application.yml中配置SMTP服务器信息:

spring:
  mail:
    host: smtp.qq.com  # SMTP服务器地址
    port: 587  # 端口号(QQ邮箱用587,SSL用465)
    username: your-email@qq.com  # 发件人邮箱
    password: your-auth-code  # 授权码(非邮箱密码)
    default-encoding: UTF-8
    protocol: smtp
    properties:
      mail:
        smtp:
          auth: true
          starttls:
            enable: true
            required: true
          ssl:
            enable: false  # 如果使用465端口则设为true
        debug: true  # 开发阶段可开启调试模式

注意:需要先在邮箱中开启SMTP服务并获取授权码:

  • QQ邮箱:设置 > 账户 > POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务 > 开启POP3/SMTP服务
  • 163邮箱:设置 > POP3/SMTP/IMAP > 开启SMTP服务
  • 企业邮箱:根据不同服务商的指引开启

二、邮件实体类

创建邮件信息的实体类:

import lombok.Data;
import java.io.Serializable;

@Data
public class MailDTO implements Serializable {
    private String recipient;  // 收件人邮箱
    private String[] recipients;  // 多个收件人(可选)
    private String subject;  // 邮件主题
    private String content;  // 邮件内容
    private String templateName;  // 模板名称(可选)
    private Object templateModel;  // 模板数据模型(可选)
}

三、邮件发送工具类

创建一个通用的邮件发送工具类:

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.FileSystemResource;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Component;
import org.springframework.ui.freemarker.FreeMarkerTemplateUtils;
import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer;

import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.io.File;
import java.util.Map;

@Component
@Slf4j
public class MailService {

    @Autowired
    private JavaMailSender mailSender;

    @Value("${spring.mail.username}")
    private String fromEmail;

    @Autowired(required = false)
    private FreeMarkerConfigurer freeMarkerConfigurer;

    /**
     * 发送简单文本邮件
     */
    public void sendSimpleMail(String to, String subject, String content) {
        SimpleMailMessage message = new SimpleMailMessage();
        message.setFrom(fromEmail);
        message.setTo(to);
        message.setSubject(subject);
        message.setText(content);
        
        try {
            mailSender.send(message);
            log.info("简单邮件发送成功,收件人:{}", to);
        } catch (Exception e) {
            log.error("简单邮件发送失败", e);
            throw new RuntimeException("邮件发送失败", e);
        }
    }

    /**
     * 发送HTML格式邮件
     */
    public void sendHtmlMail(String to, String subject, String htmlContent) {
        MimeMessage message = mailSender.createMimeMessage();
        
        try {
            MimeMessageHelper helper = new MimeMessageHelper(message, true, "UTF-8");
            helper.setFrom(fromEmail);
            helper.setTo(to);
            helper.setSubject(subject);
            helper.setText(htmlContent, true);  // true表示是HTML内容
            
            mailSender.send(message);
            log.info("HTML邮件发送成功,收件人:{}", to);
        } catch (MessagingException e) {
            log.error("HTML邮件发送失败", e);
            throw new RuntimeException("HTML邮件发送失败", e);
        }
    }

    /**
     * 发送带附件的邮件
     */
    public void sendAttachmentMail(String to, String subject, String content, String filePath) {
        MimeMessage message = mailSender.createMimeMessage();
        
        try {
            MimeMessageHelper helper = new MimeMessageHelper(message, true, "UTF-8");
            helper.setFrom(fromEmail);
            helper.setTo(to);
            helper.setSubject(subject);
            helper.setText(content, false);  // false表示纯文本
            
            // 添加附件
            FileSystemResource file = new FileSystemResource(new File(filePath));
            String fileName = file.getFilename();
            helper.addAttachment(fileName, file);
            
            mailSender.send(message);
            log.info("带附件邮件发送成功,收件人:{}", to);
        } catch (MessagingException e) {
            log.error("带附件邮件发送失败", e);
            throw new RuntimeException("带附件邮件发送失败", e);
        }
    }

    /**
     * 发送带内联图片的邮件
     */
    public void sendInlineResourceMail(String to, String subject, String content, String filePath, String contentId) {
        MimeMessage message = mailSender.createMimeMessage();
        
        try {
            MimeMessageHelper helper = new MimeMessageHelper(message, true, "UTF-8");
            helper.setFrom(fromEmail);
            helper.setTo(to);
            helper.setSubject(subject);
            helper.setText(content, true);  // HTML内容
            
            // 添加内联图片
            FileSystemResource resource = new FileSystemResource(new File(filePath));
            helper.addInline(contentId, resource);
            
            mailSender.send(message);
            log.info("带内联图片邮件发送成功,收件人:{}", to);
        } catch (MessagingException e) {
            log.error("带内联图片邮件发送失败", e);
            throw new RuntimeException("带内联图片邮件发送失败", e);
        }
    }

    /**
     * 发送模板邮件
     */
    public void sendTemplateMail(String to, String subject, String templateName, Map<String, Object> model) {
        try {
            // 使用FreeMarker模板
            String htmlContent = FreeMarkerTemplateUtils.processTemplateIntoString(
                    freeMarkerConfigurer.getConfiguration().getTemplate(templateName),
                    model);
            
            // 发送HTML邮件
            sendHtmlMail(to, subject, htmlContent);
        } catch (Exception e) {
            log.error("模板邮件发送失败", e);
            throw new RuntimeException("模板邮件发送失败", e);
        }
    }
}

四、创建邮件模板

如果需要使用FreeMarker模板,在src/main/resources/templates/目录下创建邮件模板:

1. 注册确认模板(register.html)

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>注册确认</title>
    <style>
        body { font-family: Arial, sans-serif; line-height: 1.6; }
        .container { max-width: 600px; margin: 0 auto; padding: 20px; border: 1px solid #e0e0e0; }
        .header { background-color: #4CAF50; color: white; padding: 10px; text-align: center; }
        .content { padding: 20px; }
        .button { display: inline-block; padding: 10px 20px; background-color: #4CAF50; color: white; text-decoration: none; }
        .footer { margin-top: 20px; font-size: 12px; color: #666; }
    </style>
</head>
<body>
    <div class="container">
        <div class="header">
            <h2>注册确认邮件</h2>
        </div>
        <div class="content">
            <p>亲爱的 ${username}:</p>
            <p>欢迎注册我们的系统!请点击下方按钮完成邮箱验证:</p>
            <p>
                <a href="${verifyUrl}" rel="external nofollow"  class="button">点击验证邮箱</a>
            </p>
            <p>如果您没有注册我们的系统,请忽略此邮件。</p>
        </div>
        <div class="footer">
            <p>此邮件由系统自动发送,请勿回复。</p>
        </div>
    </div>
</body>
</html>

五、Controller层实现

创建REST接口用于测试邮件发送:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.Map;

@RestController
@RequestMapping("/api/mail")
public class MailController {

    @Autowired
    private MailService mailService;

    /**
     * 发送简单文本邮件
     */
    @PostMapping("/simple")
    public String sendSimpleMail(
            @RequestParam String to,
            @RequestParam String subject,
            @RequestParam String content) {
        
        mailService.sendSimpleMail(to, subject, content);
        return "简单邮件发送成功";
    }

    /**
     * 发送HTML邮件
     */
    @PostMapping("/html")
    public String sendHtmlMail(
            @RequestParam String to,
            @RequestParam String subject,
            @RequestParam String htmlContent) {
        
        mailService.sendHtmlMail(to, subject, htmlContent);
        return "HTML邮件发送成功";
    }

    /**
     * 发送带附件的邮件
     */
    @PostMapping("/attachment")
    public String sendAttachmentMail(
            @RequestParam String to,
            @RequestParam String subject,
            @RequestParam String content,
            @RequestParam String filePath) {
        
        mailService.sendAttachmentMail(to, subject, content, filePath);
        return "带附件邮件发送成功";
    }

    /**
     * 发送注册确认邮件(使用模板)
     */
    @PostMapping("/register")
    public String sendRegisterMail(
            @RequestParam String to,
            @RequestParam String username,
            @RequestParam String verifyCode) {
        
        Map<String, Object> model = new HashMap<>();
        model.put("username", username);
        model.put("verifyUrl", "http://yourdomain.com/verify?code=" + verifyCode);
        
        mailService.sendTemplateMail(to, "【系统】注册确认邮件", "register.html", model);
        return "注册确认邮件发送成功";
    }

    /**
     * 发送带内联图片的邮件
     */
    @PostMapping("/inline")
    public String sendInlineMail(
            @RequestParam String to,
            @RequestParam String subject,
            @RequestParam String imagePath) {
        
        // HTML内容中引用内联图片
        String htmlContent = "<html><body><h3>这是一封带内联图片的邮件</h3>" +
                           "<img src='cid:image1'></body></html>";
        
        mailService.sendInlineResourceMail(to, subject, htmlContent, imagePath, "image1");
        return "带内联图片邮件发送成功";
    }
}

六、SpringBoot主程序

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class MailApplication {

    public static void main(String[] args) {
        SpringApplication.run(MailApplication.class, args);
    }
}

七、常见邮件服务器配置

1. QQ邮箱配置

spring:
  mail:
    host: smtp.qq.com
    port: 587
    username: your-qq@qq.com
    password: 你的授权码
    properties:
      mail:
        smtp:
          auth: true
          starttls:
            enable: true

2. 163邮箱配置

spring:
  mail:
    host: smtp.163.com
    port: 465
    username: your-email@163.com
    password: 你的授权码
    properties:
      mail:
        smtp:
          auth: true
          ssl:
            enable: true

3. Gmail配置

spring:
  mail:
    host: smtp.gmail.com
    port: 587
    username: your-email@gmail.com
    password: 你的授权码(或应用密码)
    properties:
      mail:
        smtp:
          auth: true
          starttls:
            enable: true

八、安全性建议

授权码管理

  • 不要在配置文件中硬编码真实的授权码
  • 建议使用环境变量或配置中心管理敏感信息
  • 生产环境使用application-prod.yml并从Git中排除

邮件频率控制

  • 实现发送频率限制,避免被邮件服务器标记为垃圾邮件
  • 考虑使用线程池异步发送邮件,提高性能

监控与日志

  • 记录所有邮件发送日志,便于排查问题
  • 实现邮件发送失败重试机制

九、测试示例

发送简单文本邮件:

POST /api/mail/simple?to=recipient@example.com&subject=测试邮件&content=这是一封测试邮件

发送注册确认邮件:

POST /api/mail/register?to=user@example.com&username=张三&verifyCode=123456

发送带附件的邮件:

POST /api/mail/attachment?to=user@example.com&subject=带附件邮件&content=请查看附件&filePath=/path/to/file.pdf

通过以上配置和代码,您可以在SpringBoot项目中轻松实现各种类型的邮件发送功能,满足用户注册验证、通知提醒、报表发送等业务需求。

以上就是SpringBoot整合Email发送的完整配置和实现方法的详细内容,更多关于SpringBoot整合Email发送的资料请关注脚本之家其它相关文章!

相关文章

  • Mybatis-plus selectByMap条件查询方式

    Mybatis-plus selectByMap条件查询方式

    这篇文章主要介绍了Mybatis-plus selectByMap条件查询方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • Java实现人机猜拳游戏

    Java实现人机猜拳游戏

    这篇文章主要为大家详细介绍了Java实现人机猜拳游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-07-07
  • Java实现汉字转全拼音的方法总结

    Java实现汉字转全拼音的方法总结

    在软件开发中,经常会遇到需要将汉字转换成拼音的场景,比如在搜索引擎优化、数据存储、国际化等方面,Java作为一种广泛使用的编程语言,提供了多种方法来实现汉字到拼音的转换,本文将详细介绍几种常用的Java汉字转全拼音的方法,并提供具体的代码示例和步骤
    2024-12-12
  • java 获取已知文件扩展名的代码

    java 获取已知文件扩展名的代码

    java 编写程序获取已知文件的扩展名. 注意: abc.txt的扩展名是txt, abc.java.txt的扩展名也是txt.,需要的朋友可以参考下
    2017-02-02
  • Java NIO实战之聊天室功能详解

    Java NIO实战之聊天室功能详解

    这篇文章主要介绍了Java NIO实战之聊天室功能,结合实例形式详细分析了java NIO聊天室具体的服务端、客户端相关实现方法与操作注意事项,需要的朋友可以参考下
    2019-11-11
  • java实现时钟效果

    java实现时钟效果

    这篇文章主要为大家详细介绍了java实现时钟效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03
  • Java定义泛型接口和类的方法实例分析

    Java定义泛型接口和类的方法实例分析

    这篇文章主要介绍了Java定义泛型接口和类的方法,结合实例形式分析了泛型相关概念、原理及泛型接口与类的定义实现方法,需要的朋友可以参考下
    2019-08-08
  • SpringMVC中的几个模型对象

    SpringMVC中的几个模型对象

    这篇文章主要介绍了SpringMVC中的几个模型对象,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • java实现水波纹扩散效果

    java实现水波纹扩散效果

    这篇文章主要为大家详细介绍了java实现水波纹扩散效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • Springboot实现文件上传至linux指定目录

    Springboot实现文件上传至linux指定目录

    这篇文章主要为大家详细介绍了springboot项目如何实现一个文件上传接口,涉及vsftpd服务、SSH协议以及对linux系统的一些配置,希望对大家有所帮助
    2025-08-08

最新评论