Java 发邮件还要钱?教你用 Spring Boot + QQ 邮箱白嫖推送
前言:最近在做项目时需要通过 Java 发送系统通知。一开始以为要买昂贵的企业邮件服务,结果研究发现,其实利用常用的 QQ 邮箱/企业微信 SMTP 服务,完全可以 0 成本实现,而且效果非常棒!本文记录了从环境配置、踩坑排查到编写“苹果风”HTML 邮件的全过程。
一、 发邮件到底要不要钱?
先说结论:对于开发测试、个人项目、中小规模通知,完全免费!
我们不需要去买阿里云/腾讯云的付费邮件推送,只需要利用我们手头现有的邮箱(QQ 邮箱、163 邮箱、企业微信邮箱)开启 SMTP 服务 即可。
- 个人邮箱:免费,每日有发送上限(通常几十到几百封,通常是500封),适合测试。
- 企业微信:免费,更正式,适合内部通知,内部人员免费无限制,外部人员通常是500封。
二、 准备工作:获取“授权码”
这是最关键的一步! 代码里填的密码绝不是你的 QQ 登录密码。
- 登录网页版 QQ 邮箱 -> 设置 -> 账户。
- 找到 POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务。
- 开启 POP3/SMTP服务。
- 按照提示生成 授权码(一串 16 位的字母),复制保存好!
三、 Spring Boot 项目实战
1. 引入依赖
在 pom.xml 中加入官方的 Mail Starter:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
2. 配置文件 (application.yml)
推荐使用 YAML 格式,结构更清晰。
⚠️ 避坑:
password填的是授权码!冒号后面必须有一个空格!username必须是完整的邮箱地址。
YAML配置文件
spring:
mail:
# QQ邮箱服务器 (如果是企业微信则用 smtp.exmail.qq.com)
host: smtp.qq.com
# 端口号 (SSL加密端口)
port: 465
# 你的完整邮箱账号
username: 12345678@qq.com
# 刚才获取的16位授权码
password: xxxxxxxxxxxxxxxx
default-encoding: UTF-8
# 进阶配置:开启 SSL 安全连接 (必须配置,否则无法发送)
properties:
mail:
smtp:
auth: true
starttls:
enable: true
required: true
socketFactory:
class: javax.net.ssl.SSLSocketFactory
3. 发送第一封纯文本邮件
编写一个简单的测试类:
Java
@Autowired
private JavaMailSender mailSender;
@Test
public void sendSimpleMail() {
SimpleMailMessage message = new SimpleMailMessage();
// 发件人必须和配置文件里的 username 一致
message.setFrom("12345678@qq.com");
message.setTo("target@example.com");
message.setSubject("测试邮件");
message.setText("恭喜你,代码跑通了!");
mailSender.send(message);
}
四、 进阶:发送“苹果风” HTML 邮件
发纯文本太丑了?我们利用 Java 17+ 的文本块 (Text Blocks) 特性,配合 MimeMessage,可以直接在邮件里渲染网页。
这里分享一个我模仿 Apple 官网风格写的 HTML 模板:
Java
@Test
public void sendAppleStyleMail() throws Exception {
MimeMessage mimeMessage = mailSender.createMimeMessage();
// 第二个参数 true 表示支持 HTML/附件
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
helper.setFrom("12345678@qq.com");
helper.setTo("target@example.com");
helper.setSubject("【新品首发】iPhone 17 Pro 现已登场");
// 极简苹果风 HTML 模板
String htmlContent = """
<!DOCTYPE html>
<html>
<body style="margin:0; padding:0; background-color:#f5f5f7; font-family:'Helvetica Neue',sans-serif;">
<table width="100%" style="padding: 40px 0;">
<tr>
<td align="center">
<table width="600" style="background:#fff; border-radius:18px; overflow:hidden; box-shadow:0 4px 12px rgba(0,0,0,0.05);">
<tr>
<td align="center" style="padding:40px;">
<h1 style="color:#1d1d1f; font-size:48px; margin:0;">iPhone 17 Pro</h1>
<p style="color:#86868b; font-size:24px; margin-top:10px;">钛金属。强悍,轻盈。</p>
<img src="[https://images.unsplash.com/photo-1696446701796-da61225697cc?w=500](https://images.unsplash.com/photo-1696446701796-da61225697cc?w=500)" width="400" style="margin:30px 0;">
<br>
<a href="[https://www.apple.com](https://www.apple.com)" style="background:#0071e3; color:#fff; text-decoration:none; padding:12px 35px; border-radius:980px; display:inline-block;">
立即购买 >
</a>
</td>
</tr>
</table>
<p style="color:#86868b; font-size:12px; margin-top:20px;">Copyright © 2026 Apple Inc.</p>
</td>
</tr>
</table>
</body>
</html>
""";
helper.setText(htmlContent, true); // true 代表是 HTML
mailSender.send(mimeMessage);
}
收件结果
效果展示: 收到邮件的那一刻,简直像真的苹果官方广告一样!
五、 常见报错排雷指南
在开发过程中,我遇到了两个最经典的报错,帮大家避坑:
1. 报错:535 Login fail
-
原因:登录失败。
-
排查:
- 检查
password填的是不是QQ密码?(必须是授权码!) - 检查 YAML 配置文件里,密码后面是不是多复制了空格?(YAML 对缩进和空格极度敏感)。
- 检查
2. 报错:501 Mail from address must be same as authorization user
- 原因:发件人欺诈。
- 排查:代码里的
message.setFrom("xxx")必须和配置文件里的username完全一致。不能配置文件写A,代码里冒充B去发邮件。
六、 总结
Spring Boot 整合邮件发送非常简单,只要搞定了 SMTP 授权码,剩下的就是拼凑 HTML 的工作了。对于个人开发者来说,这是一个不需要花钱就能极大提升项目“逼格”的小功能,强烈推荐大家动手试试!