SpringMail 邮件服务 - 第五章. 生产环境配置:主流邮箱服务商接入

SpringMail 邮件服务 - 第五章. 生产环境配置:主流邮箱服务商接入

本章将手把手教你配置 Gmail、QQ 邮箱、163 邮箱、等主流邮件服务商,掌握授权码获取、频率限制、常见错误排查等生产环境必备技能。


5.1. 为什么不能直接使用登录密码

在第二章的示例中,我们在配置文件中填写了 “授权码” 而不是邮箱的登录密码。很多初学者会疑惑:为什么不能直接用登录密码?

5.1.1. 安全风险:密码泄露的连锁反应

假设你的应用直接使用邮箱登录密码连接 SMTP 服务器。如果你的应用代码被泄露(比如误提交到公开的 GitHub 仓库),黑客不仅能用你的邮箱发送垃圾邮件,还能:

  1. 登录你的邮箱查看所有历史邮件
  2. 修改邮箱设置(如转发规则)
  3. 通过 “忘记密码” 功能入侵你的其他账号(如银行、社交媒体)

而授权码的权限范围仅限于 “通过 SMTP/POP3/IMAP 协议收发邮件”,无法登录网页版邮箱,也无法修改邮箱设置。即使授权码泄露,你只需要在邮箱设置中删除这个授权码,黑客就立即失去访问权限,不需要修改邮箱密码。

5.1.2. 邮件服务商的强制要求

从 2022 年开始,Gmail、Outlook 等国际邮件服务商陆续禁用了 “使用登录密码连接 SMTP” 的方式,强制要求使用以下两种方式之一:

  1. 应用专用密码(App Password):本质上就是授权码
  2. OAuth 2.0:更安全的授权方式,但配置复杂

重要:微软已宣布将在 2026 年彻底停止 Office 365 的基本认证(Basic Authentication),届时所有使用登录密码的 SMTP 连接都会失效,必须迁移到 OAuth 2.0 或应用专用密码。

国内的 QQ 邮箱、163 邮箱虽然还允许使用登录密码,但也强烈建议使用授权码,因为它们的 SMTP 服务默认是关闭的,必须手动开启并生成授权码。


5.2. Gmail 配置

Gmail 是全球最大的免费邮件服务商,拥有超过 18 亿用户。如果你的应用面向国际用户,Gmail 是首选。

但对于国内开发者而言,使用 Gmail 有两个核心门槛:账号的安全设置(应用专用密码) 以及 网络连通性(必须走代理)

登录 Gmail 开启 POP/IMAP

5.2.1. 开启两步验证(前置条件)

Gmail 的应用专用密码功能要求账号必须开启两步验证。

步骤 1:访问 Google 账号安全设置

打开浏览器,访问 https://myaccount.google.com/security,登录你的 Gmail 账号。

步骤 2:开启两步验证

在 “登录 Google” 部分,找到 “两步验证”(2-Step Verification),点击进入。如果显示 “已关闭”,点击 “开始使用” 按钮。

Google 会要求你验证手机号码(通过短信或语音电话)。按照提示完成验证后,两步验证就开启了。

image-20260126104720741

5.2.2. 生成应用专用密码(新版入口)

注意! 在 2025/2026 年后的新版 Google 界面中,“应用专用密码”选项已被折叠隐藏,无法直接在安全性主页找到。

步骤 1:进入应用专用密码页面(两种方法)

在页面顶部的 “Search Google Account”(搜索 Google 帐号)搜索框中,直接输入 App passwords应用专用密码,点击搜索结果跳转。

image-20260126113505238

步骤 2:生成密码

  1. 输入应用名称,比如 “Spring Boot App”(新版界面简化了设备选择步骤,直接输入名称即可)。
  2. 点击 “Create” 或 “生成” 按钮。

Google 会显示一个 16 位的密码(格式类似 abcd efgh ijkl mnop)。这就是你的应用专用密码。

重要:这个密码只会显示一次,关闭窗口后无法再次查看。请立即复制并保存到安全的地方(配置时可以忽略中间的空格)。

5.2.3. Spring Boot 与 SimpleJavaMail 配置(含代理)

由于 GFW 的存在,国内服务器无法直接连接 smtp.gmail.com,会报连接超时错误。

为了解决这个问题,我们需要引入 SimpleJavaMail 库,利用其强大的代理支持功能,配合本地或服务器上的代理节点(如 v2ray/clash,默认端口通常为 7890 或自定义端口,此处示例为 5654)。

1. 引入依赖

1
2
3
4
5
6
7
8
9
10
11
<dependency>
<groupId>org.simplejavamail</groupId>
<artifactId>simple-java-mail</artifactId>
<version>8.5.1</version>
</dependency>

<dependency>
<groupId>org.simplejavamail</groupId>
<artifactId>spring-module</artifactId>
<version>8.5.1</version>
</dependency>

2. 配置文件 (application.yml)

我们需要同时配置 Spring 原生邮件参数(用于基础兼容)和 SimpleJavaMail 参数(用于代理转发)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
spring:
mail:
host: smtp.gmail.com
port: 587
# 注意:这里填写的是你的完整 Gmail 邮箱
username: @gmail.com
# 注意:这里必须填写生成的 16 位应用专用密码,而非 Google 登录密码
password: 这里输入去掉空格的16位密码
properties:
mail:
smtp:
auth: true
starttls:
enable: true
required: true

# SimpleJavaMail 增强配置(核心:解决国内访问问题)
simplejavamail:
transportstrategy: SMTP_TLS
smtp:
host: smtp.gmail.com
port: 587
username: xxx@gmail.com
password: 这里输入去掉空格的16位密码
proxy:
# 代理地址,本地开发通常为 127.0.0.1,服务器部署需填代理容器IP
host: 127.0.0.1
# 代理端口,请根据你实际使用的代理软件填写(如 Clash 为 7890,示例为 5654)
port: 5654

配置解读

  • Proxy 配置:这是国内发送 Gmail 成功的关键。simplejavamail.proxy 会拦截邮件传输流量,将其通过指定的 SOCKS/HTTP 代理隧道转发,从而绕过网络封锁。
  • Password:务必使用去掉空格的 16 位应用专用密码。
  • TransportStrategy:显式指定 SMTP_TLS 确保连接安全。

5.2.4. Gmail 的发信限制

Gmail 对免费账号有严格的发信限制,防止垃圾邮件滥用。

限制类型免费账号Google Workspace(付费)
每天发信量500 封2000 封
单封邮件收件人数100 个500 个
附件大小25MB25MB

超限后的表现

如果超过每天 500 封的限制,Gmail 会返回错误:

1
550 5.4.5 Daily sending quota exceeded

中文翻译:每日发送配额已超限。

此时你的账号会被临时禁止发信 24 小时。

应对策略

  1. 分批发送:如果需要发送 1000 封邮件,分两天发送,每天 500 封
  2. 使用多个账号:创建多个 Gmail 账号,轮流发送
  3. 升级到 Google Workspace:付费版本的限制是 2000 封/天

5.3. QQ 邮箱配置(国内用户)

QQ 邮箱是国内最大的免费邮件服务商,拥有超过 5 亿用户。如果你的应用面向国内用户,QQ 邮箱是首选。

5.3.1. 开启 SMTP 服务并生成授权码

步骤 1:开启 QQ 邮箱的 SMTP 服务

image-20260124160431342

image-20260124160500496

登录 QQ 邮箱网页版(mail.qq.com),点击顶部的 “设置” → “账户”,找到 “POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV 服务” 这一栏。

你会看到 “SMTP 服务” 默认是关闭的。点击 “开启” 按钮,QQ 会要求你发送一条短信验证身份。验证通过后,QQ 会生成一个 授权码(一串 16 位的字符,类似 abcdefghijklmnop)。

重要:这个授权码不是你的 QQ 密码!它是专门用于第三方客户端登录的临时密码。请妥善保管,不要泄露给他人。

5.3.2. Spring Boot 配置

application.yml 中添加以下配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
spring:
mail:
host: smtp.qq.com
port: 587
username: 你的QQ邮箱@qq.com
password: 刚才获取的授权码
properties:
mail:
smtp:
auth: true
starttls:
enable: true
required: true

5.3.3. QQ 邮箱的发信限制

QQ 邮箱对发信频率有限制,但官方文档没有明确说明具体数值。根据用户反馈和测试,大致限制如下:

限制类型普通用户VIP 用户
每天发信量约 50-100 封约 200-300 封
每小时发信量约 20 封约 50 封
单封邮件收件人数20 个50 个

超限后的表现

如果发信过快,QQ 邮箱会返回错误:

1
451 Requested mail action not taken: too much fail authentication

中文翻译:请求的邮件操作未执行,认证失败次数过多。

此时你的账号会被临时禁止发信 1-2 小时。

应对策略

  1. 控制发信频率:在代码中添加延迟,每发送一封邮件后等待 3-5 秒
  2. 使用企业邮箱:QQ 企业邮箱(exmail.qq.com)的限制更宽松

5.4. 163 邮箱配置(国内用户)

163 邮箱是网易旗下的免费邮件服务,在国内拥有海量用户,连接速度快且稳定。

5.4.1. 开启 SMTP 服务并生成授权码

步骤 1:登录 163 邮箱

打开浏览器,访问 https://mail.163.com,登录你的 163 邮箱。

步骤 2:进入设置页面

点击页面顶部的 “设置” 按钮,选择 “POP3/SMTP/IMAP” 标签。

步骤 3:开启 SMTP 服务

找到 “POP3/SMTP 服务” 和 “IMAP/SMTP 服务”,确保它们都已勾选 “开启”。

image-20260126140404237

5.4.2. Spring Boot 3 配置 (SSL 模式)

对于 163 邮箱,必须使用 465 端口配合 SSL 加密

错误:使用端口 587

1
2
# 错误配置 - 会导致连接失败
port: 587 # 不要使用这个端口!

错误表现Got bad greeting from SMTP host: smtp.163.com, port: 587, response: [EOF]

✅ 正确做法:163 邮箱必须使用端口 465


正确的完整配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
spring:
mail:
host: smtp.163.com
port: 465 # ⚠️ 必须使用 465,不要用 587
username: 你的163邮箱账号 # 可以是纯数字或完整邮箱
password: 你的授权码 # ⚠️ 必须是授权码,不是登录密码
default-encoding: UTF-8
properties:
mail:
smtp:
auth: true
# ⚠️ 只需要这个,不要配置 socketFactory
ssl:
enable: true

配置要点

  • Port 465(必须):163 邮箱在 465 端口强制 SSL,使用 587 端口会导致 [EOF] 连接错误

5.4.3. 163 邮箱的发信限制

163 邮箱对发信频率有明确的限制,且会根据账号等级动态调整。

限制类型普通用户基础版会员超级会员
每天发信量300-400 封700-800 封1300-1400 封
每 15 分钟发信量约 50 封约 100 封约 200 封
单次群发收件人数100 个100 个100 个

超限后的表现

如果超过 15 分钟的发信限制,163 邮箱会返回错误:

1
2
451 MI:SFQ 发信人在15分钟内的发信数量超过限制,请控制发信频率

如果超过每天的发信限制,会返回:

1
2
451 RP:QRC 发信方短期内累计的收件人数量超过限制,该发件人被临时禁止发信

应对策略

  1. 控制发信频率:每 15 分钟不超过 50 封(普通用户)
  2. 升级会员:超级会员的限制是普通用户的 4 倍
  3. 使用企业邮箱:163 企业邮箱的限制更宽松(每天 1000-2500 封)

5.5. 三大邮箱对比与选型建议

结合 Spring Boot 3 的特性与各大厂商的最新安全策略,以下是最终选型对比。

维度GmailQQ 邮箱163 邮箱
用户群体国际用户国内用户国内用户
发信配额/天500 封50-100 封300-400 封
认证方式应用专用密码 (需代理)授权码 (短信获取)授权码 (自设)
配置难度中等 (需配置代理)简单简单
稳定性极高
国内访问必须代理正常正常
Spring Boot 3 兼容完美 (需 SimpleJavaMail)完美完美

选型建议

  1. 最省心(国内)163 邮箱。配置最简单,Spring Boot 3 兼容性好,不需要像 QQ 那样频繁发短信验证。
  2. 最省心(国际)Gmail(配合前文提到的 SimpleJavaMail 代理方案)。
  3. 大规模推送:不要使用上述任何一种免费邮箱。请使用 阿里云 DirectMailSendGridAmazon SES