使用 Spring Boot 集成 QQ 邮箱实现邮件发送
在现代的 Java 应用中,发送电子邮件是一项非常常见的需求。Spring Boot 提供了强大的邮件支持,通过配置和使用 spring-boot-starter-mail 依赖,我们可以快速实现向指定邮箱发送邮件的功能。本篇博客将带领大家使用 Spring Boot 集成 QQ 邮箱并实现邮件发送功能,内容详尽且适合初学者。
开发环境
- 开发工具: IntelliJ IDEA 或其他 Java 开发工具
- JDK 版本: 1.8 及以上
- Spring Boot 版本: 2.5.x 或更高
- 依赖管理工具: Maven 或 Gradle
- 邮件服务: QQ 邮箱(支持 SMTP 协议)
前置准备
-
获取 QQ 邮箱的授权码
QQ 邮箱的 SMTP 协议需要通过授权码来登录,而不是直接使用邮箱密码。授权码的获取步骤如下:- 登录 QQ 邮箱,在邮箱界面右上角进入 设置 -> 账户。
- 启用 SMTP 服务,根据提示生成授权码并保存(授权码相当于密码)。
-
确保邮箱支持 SMTP 协议
- 确保已经在 QQ 邮箱设置中开启了 SMTP 服务。
- 默认 SMTP 服务器地址:
smtp.qq.com - 默认 SMTP 服务端口:465(SSL) 或 587(TLS)。
项目搭建
1. 添加依赖
在 Spring Boot 项目中,邮件功能由 spring-boot-starter-mail 提供。通过 Maven 或 Gradle 添加依赖。
Maven 配置:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
</dependencies>
Gradle 配置:
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-mail'
}
2. 配置 application.yml
在项目的 src/main/resources 目录下,编辑 application.yml 文件,添加与 QQ 邮箱相关的 SMTP 配置:
spring:
mail:
host: smtp.qq.com # QQ 邮箱 SMTP 服务器地址
port: 465 # SMTP 服务端口(SSL)
username: your_email@qq.com # 发件人邮箱(QQ邮箱地址)
password: your_authorization_code # 授权码(非邮箱密码)
protocol: smtp # 邮件协议
properties:
mail:
smtp:
auth: true # 启用认证
starttls.enable: true # 启用 TLS
ssl.enable: true # 启用 SSL 加密
3. 配置 MailService
创建一个邮件服务类,封装发送邮件的逻辑:
MailService.java:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.stereotype.Service;
@Service
public class MailService {
@Autowired
private JavaMailSender mailSender;
/**
* 发送简单文本邮件
* @param to 收件人邮箱
* @param subject 邮件主题
* @param content 邮件内容
*/
public void sendSimpleMail(String to, String subject, String content) {
// 创建简单邮件消息对象
SimpleMailMessage message = new SimpleMailMessage();
message.setFrom("your_email@qq.com"); // 发件人(需与配置中的 username 一致)
message.setTo(to); // 收件人
message.setSubject(subject); // 邮件主题
message.setText(content); // 邮件内容
// 发送邮件
mailSender.send(message);
}
}
4. 创建测试接口
为了方便测试邮件功能,可以创建一个简单的 Controller,提供邮件发送的 REST 接口。
MailController.java:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/mail")
public class MailController {
@Autowired
private MailService mailService;
/**
* 发送邮件的接口
* @param to 收件人邮箱
* @param subject 邮件主题
* @param content 邮件内容
* @return 结果反馈
*/
@PostMapping("/send")
public String sendMail(@RequestParam String to,
@RequestParam String subject,
@RequestParam String content) {
try {
mailService.sendSimpleMail(to, subject, content);
return "邮件发送成功!";
} catch (Exception e) {
e.printStackTrace();
return "邮件发送失败:" + e.getMessage();
}
}
}
运行测试
1. 启动项目
运行 Spring Boot 项目,确保没有错误启动日志。项目默认监听在 http://localhost:8080。
2. 调用邮件发送接口
使用 Postman、cURL 或浏览器访问测试接口。
-
请求 URL:
POST http://localhost:8080/mail/send -
请求参数:
to:收件人邮箱,例如recipient@example.comsubject:邮件主题,例如测试邮件content:邮件内容,例如这是一封测试邮件,使用 Spring Boot 发送。
Postman 示例:
- 请求方式:
POST - 请求 Body:
x-www-form-urlencodedto:recipient@example.comsubject:测试邮件content:这是一封测试邮件,使用 Spring Boot 发送。
完整功能优化
1. 支持 HTML 邮件
如果需要发送 HTML 格式的邮件,可以使用 MimeMessage 类:
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.stereotype.Service;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
@Service
public class MailService {
@Autowired
private JavaMailSender mailSender;
/**
* 发送 HTML 格式的邮件
* @param to 收件人邮箱
* @param subject 邮件主题
* @param content HTML 格式的邮件内容
*/
public void sendHtmlMail(String to, String subject, String content) throws MessagingException {
// 创建 MimeMessage 对象
MimeMessage message = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom("your_email@qq.com");
helper.setTo(to);
helper.setSubject(subject);
helper.setText(content, true); // 第二个参数为 true,表示内容为 HTML
// 发送邮件
mailSender.send(message);
}
}
2. 异步发送邮件
为提高性能,邮件发送可以使用异步方式。通过 Spring 的 @Async 注解实现:
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
@Service
public class MailService {
@Autowired
private JavaMailSender mailSender;
@Async
public void sendSimpleMailAsync(String to, String subject, String content) {
SimpleMailMessage message = new SimpleMailMessage();
message.setFrom("your_email@qq.com");
message.setTo(to);
message.setSubject(subject);
message.setText(content);
mailSender.send(message);
}
}
注意: 需要在主类中启用异步支持:
@SpringBootApplication
@EnableAsync
public class MailApplication {
public static void main(String[] args) {
SpringApplication.run(MailApplication.class, args);
}
}
常见问题及解决
-
问题:
535 Error: authentication failed
解决: 检查授权码是否正确,确保开启了 SMTP 服务。 -
问题:邮件发送速度慢
解决: 使用异步方式发送邮件。 -
问题:邮件未送达
解决: 检查垃圾邮件或收件人地址是否正确。
总结
通过以上步骤,我们成功使用 Spring Boot 集成 QQ 邮箱并实现了邮件发送功能。我们不仅实现了基本的文本邮件,还扩展到 HTML 邮件和异步邮件发送。在实际应用中,可以根据需求进一步完善功能,例如添加附件、模板引擎渲染等。

浙公网安备 33010602011771号