Java 发邮件还要钱?教你用 Spring Boot + QQ 邮箱白嫖企业级推送

221 阅读3分钟

Java 发邮件还要钱?教你用 Spring Boot + QQ 邮箱白嫖推送

前言:最近在做项目时需要通过 Java 发送系统通知。一开始以为要买昂贵的企业邮件服务,结果研究发现,其实利用常用的 QQ 邮箱/企业微信 SMTP 服务,完全可以 0 成本实现,而且效果非常棒!本文记录了从环境配置、踩坑排查到编写“苹果风”HTML 邮件的全过程。

一、 发邮件到底要不要钱?

先说结论:对于开发测试、个人项目、中小规模通知,完全免费!

我们不需要去买阿里云/腾讯云的付费邮件推送,只需要利用我们手头现有的邮箱(QQ 邮箱、163 邮箱、企业微信邮箱)开启 SMTP 服务 即可。

  • 个人邮箱:免费,每日有发送上限(通常几十到几百封,通常是500封),适合测试。
  • 企业微信:免费,更正式,适合内部通知,内部人员免费无限制,外部人员通常是500封。

二、 准备工作:获取“授权码”

这是最关键的一步! 代码里填的密码绝不是你的 QQ 登录密码。

  1. 登录网页版 QQ 邮箱 -> 设置 -> 账户
  2. 找到 POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务
  3. 开启 POP3/SMTP服务
  4. 按照提示生成 授权码(一串 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 格式,结构更清晰。

⚠️ 避坑

  1. password 填的是授权码
  2. 冒号 后面必须有一个空格
  3. 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);
}

收件结果

image.png

效果展示: 收到邮件的那一刻,简直像真的苹果官方广告一样!

五、 常见报错排雷指南

在开发过程中,我遇到了两个最经典的报错,帮大家避坑:

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 的工作了。对于个人开发者来说,这是一个不需要花钱就能极大提升项目“逼格”的小功能,强烈推荐大家动手试试!