本文目录导读:

我将为您提供一个完整的Spring Boot发送邮件案例,包括基本配置、纯文本邮件、HTML邮件、附件邮件等常见场景。
项目依赖配置
Maven依赖(pom.xml)
<dependencies>
<!-- Spring Boot Starter Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Spring Boot Starter Mail -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
<!-- 可选:模板引擎用于HTML邮件 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
</dependencies>
配置文件
application.yml
spring:
mail:
host: smtp.qq.com
port: 587
username: your_email@qq.com
password: your_email_password # QQ邮箱使用授权码
default-encoding: UTF-8
properties:
mail:
smtp:
auth: true
starttls:
enable: true
connectiontimeout: 5000
timeout: 3000
writetimeout: 5000
# 自定义邮件配置
mail:
from: "发送者名称 <your_email@qq.com>"
to: "recipient@example.com"
subject: "测试邮件主题"
核心代码实现
1 邮件服务接口
package com.example.mail.service;
import javax.mail.MessagingException;
import java.io.File;
import java.util.Map;
public interface MailService {
// 发送简单文本邮件
void sendSimpleMail(String to, String subject, String content);
// 发送HTML邮件
void sendHtmlMail(String to, String subject, String content) throws MessagingException;
// 发送带附件的邮件
void sendAttachmentMail(String to, String subject, String content, String filePath) throws MessagingException;
// 发送带图片的HTML邮件
void sendInlineResourceMail(String to, String subject, String content, String rscPath, String rscId) throws MessagingException;
// 使用模板发送邮件
void sendTemplateMail(String to, String subject, Map<String, Object> templateModel) throws MessagingException;
}
2 邮件服务实现类
package com.example.mail.service.impl;
import com.example.mail.service.MailService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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.Service;
import org.springframework.web.multipart.MultipartFile;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.io.File;
import java.util.Map;
@Service
public class MailServiceImpl implements MailService {
private static final Logger logger = LoggerFactory.getLogger(MailServiceImpl.class);
@Autowired
private JavaMailSender mailSender;
@Autowired
private TemplateEngine templateEngine;
@Value("${spring.mail.username}")
private String from;
@Value("${mail.from}")
private String mailFrom;
@Override
public void sendSimpleMail(String to, String subject, String content) {
SimpleMailMessage message = new SimpleMailMessage();
message.setFrom(from);
message.setTo(to);
message.setSubject(subject);
message.setText(content);
try {
mailSender.send(message);
logger.info("简单邮件已发送");
} catch (Exception e) {
logger.error("发送简单邮件时发生异常", e);
throw new RuntimeException("发送邮件失败", e);
}
}
@Override
public void sendHtmlMail(String to, String subject, String content) throws MessagingException {
MimeMessage message = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(from);
helper.setTo(to);
helper.setSubject(subject);
helper.setText(content, true); // true表示HTML格式
try {
mailSender.send(message);
logger.info("HTML邮件已发送");
} catch (Exception e) {
logger.error("发送HTML邮件时发生异常", e);
throw new RuntimeException("发送HTML邮件失败", e);
}
}
@Override
public void sendAttachmentMail(String to, String subject, String content, String filePath) throws MessagingException {
MimeMessage message = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(from);
helper.setTo(to);
helper.setSubject(subject);
helper.setText(content, true);
// 添加附件
FileSystemResource file = new FileSystemResource(new File(filePath));
String fileName = file.getFilename();
helper.addAttachment(fileName, file);
try {
mailSender.send(message);
logger.info("带附件邮件已发送");
} catch (Exception e) {
logger.error("发送带附件邮件时发生异常", e);
throw new RuntimeException("发送带附件邮件失败", e);
}
}
@Override
public void sendInlineResourceMail(String to, String subject, String content, String rscPath, String rscId) throws MessagingException {
MimeMessage message = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(from);
helper.setTo(to);
helper.setSubject(subject);
helper.setText(content, true);
// 添加图片资源
FileSystemResource res = new FileSystemResource(new File(rscPath));
helper.addInline(rscId, res);
try {
mailSender.send(message);
logger.info("带图片HTML邮件已发送");
} catch (Exception e) {
logger.error("发送带图片HTML邮件时发生异常", e);
throw new RuntimeException("发送带图片HTML邮件失败", e);
}
}
@Override
public void sendTemplateMail(String to, String subject, Map<String, Object> templateModel) throws MessagingException {
Context context = new Context();
context.setVariables(templateModel);
// 使用Thymeleaf模板
String emailContent = templateEngine.process("emailTemplate", context);
MimeMessage message = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(from);
helper.setTo(to);
helper.setSubject(subject);
helper.setText(emailContent, true);
try {
mailSender.send(message);
logger.info("模板邮件已发送");
} catch (Exception e) {
logger.error("发送模板邮件时发生异常", e);
throw new RuntimeException("发送模板邮件失败", e);
}
}
// 支持MultipartFile附件的方法
public void sendMailWithAttachment(String to, String subject, String content, MultipartFile attachment) throws MessagingException {
MimeMessage message = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(from);
helper.setTo(to);
helper.setSubject(subject);
helper.setText(content, true);
// 添加MultipartFile附件
helper.addAttachment(attachment.getOriginalFilename(), attachment);
try {
mailSender.send(message);
logger.info("邮件已发送,包含附件: {}", attachment.getOriginalFilename());
} catch (Exception e) {
logger.error("发送邮件时发生异常", e);
throw new RuntimeException("发送邮件失败", e);
}
}
}
3 邮件控制器
package com.example.mail.controller;
import com.example.mail.service.MailService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.util.HashMap;
import java.util.Map;
@RestController
@RequestMapping("/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 content) {
try {
mailService.sendHtmlMail(to, subject, content);
return "HTML邮件发送成功!";
} catch (Exception e) {
return "邮件发送失败: " + e.getMessage();
}
}
// 发送带附件的邮件
@PostMapping("/attachment")
public String sendAttachmentMail(@RequestParam String to,
@RequestParam String subject,
@RequestParam String content,
@RequestParam String filePath) {
try {
mailService.sendAttachmentMail(to, subject, content, filePath);
return "带附件邮件发送成功!";
} catch (Exception e) {
return "邮件发送失败: " + e.getMessage();
}
}
// 发送带文件的邮件(从客户端上传文件)
@PostMapping("/upload")
public String sendMailWithUpload(@RequestParam String to,
@RequestParam String subject,
@RequestParam String content,
@RequestParam("file") MultipartFile file) {
try {
MailServiceImpl impl = (MailServiceImpl) mailService;
impl.sendMailWithAttachment(to, subject, content, file);
return "带附件邮件发送成功!";
} catch (Exception e) {
return "邮件发送失败: " + e.getMessage();
}
}
// 发送模板邮件
@PostMapping("/template")
public String sendTemplateMail(@RequestParam String to,
@RequestParam String subject) {
try {
Map<String, Object> templateModel = new HashMap<>();
templateModel.put("name", "张三");
templateModel.put("message", "这是一个模板测试邮件");
mailService.sendTemplateMail(to, subject, templateModel);
return "模板邮件发送成功!";
} catch (Exception e) {
return "邮件发送失败: " + e.getMessage();
}
}
// 测试发送简单邮件
@GetMapping("/test")
public String testSend() {
try {
mailService.sendSimpleMail("recipient@example.com", "测试邮件", "这是测试内容");
return "测试邮件发送成功!";
} catch (Exception e) {
return "邮件发送失败: " + e.getMessage();
}
}
}
4 Thymeleaf模板文件
创建 src/main/resources/templates/emailTemplate.html:
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">邮件模板</title>
</head>
<body>
<div style="padding: 20px; background-color: #f5f5f5;">
<h1>你好, <span th:text="${name}"></span>!</h1>
<p th:text="${message}"></p>
<hr>
<footer>
<p>这是一封自动发送的邮件, 请勿回复。</p>
</footer>
</div>
</body>
</html>
配置类
package com.example.mail.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import java.util.Properties;
@Configuration
public class MailConfig {
@Bean
public JavaMailSender javaMailSender() {
JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
mailSender.setHost("smtp.qq.com");
mailSender.setPort(587);
mailSender.setUsername("your_email@qq.com");
mailSender.setPassword("your_email_password");
Properties props = mailSender.getJavaMailProperties();
props.put("mail.transport.protocol", "smtp");
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.connectiontimeout", "5000");
props.put("mail.smtp.timeout", "3000");
props.put("mail.smtp.writetimeout", "5000");
return mailSender;
}
}
使用方法示例
1 在Service中使用
@Service
public class UserService {
@Autowired
private MailService mailService;
public void registerUser(String email, String username) {
// 业务逻辑
// 发送注册成功邮件
String subject = "注册成功通知";
String content = String.format("亲爱的%s,恭喜您注册成功!", username);
try {
mailService.sendHtmlMail(email, subject,
"<h2>欢迎注册</h2><p>" + content + "</p>");
} catch (Exception e) {
// 邮件发送失败,但注册可能成功,需要异步处理
log.error("发送注册邮件失败", e);
}
}
}
2 异步发送邮件
package com.example.mail.service;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
@Service
public class AsyncMailService {
@Autowired
private MailService mailService;
@Async
public void sendAsyncMail(String to, String subject, String content) {
mailService.sendSimpleMail(to, subject, content);
}
}
测试类
package com.example.mail;
import com.example.mail.service.MailService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class MailApplicationTests {
@Autowired
private MailService mailService;
@Test
void sendSimpleMailTest() {
mailService.sendSimpleMail(
"recipient@example.com",
"测试简单邮件",
"这是一封测试邮件"
);
}
@Test
void sendHtmlMailTest() throws Exception {
String content = "<html><body>"
+ "<h2>HTML邮件测试</h2>"
+ "<p>这是一封<strong>HTML</strong>格式的邮件</p>"
+ "</body></html>";
mailService.sendHtmlMail("recipient@example.com", "HTML邮件", content);
}
}
邮件服务器配置参考
常见邮箱SMTP配置:
| 邮箱 | SMTP服务器 | SSL端口 | 需要设置 |
|---|---|---|---|
| QQ邮箱 | smtp.qq.com | 465/587 | 授权码(非密码) |
| 163邮箱 | smtp.163.com | 465/994 | 客户端授权密码 |
| Gmail | smtp.gmail.com | 587 | 应用专用密码 |
| Outlook | smtp-mail.outlook.com | 587 | 密码 |
注意事项
- 配置授权码:QQ、163等邮箱需要使用授权码而不是邮箱密码
- 安全协议:建议使用SSL/TLS加密连接
- 发送限制:多数邮箱服务商有每日发送数量限制
- 编码问题:确保邮件内容正确编码,UTF-8
- 异步处理:建议使用异步方式发送邮件避免阻塞主流程
- 异常处理:发送失败时要添加重试机制和错误日志
完整示例代码
完整的项目结构:
src/main/java/com/example/mail/
├── MailApplication.java
├── config/
│ └── MailConfig.java
├── controller/
│ └── MailController.java
├── service/
│ ├── MailService.java
│ ├── AsyncMailService.java
│ └── impl/
│ └── MailServiceImpl.java
└── resources/
├── application.yml
└── templates/
└── emailTemplate.html
这个案例涵盖了Spring Boot发送邮件的所有常见场景,包括简单文本、HTML、附件、模板等,您可以根据实际需求选择合适的实现方式。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播