SMTP 端口 25、465、587:有什么区别?
25 端口用于服务器间传递,多数云环境封锁出站;465 端口使用隐式 TLS,是客户端和应用发信的正确选择;587 端口需要 STARTTLS,Rovela 不对外发布。

SMTP 常用的端口有三个:25、465、587。它们讲的是同一套协议,区别在于谁在用,以及加密从哪一刻开始。
一张表看懂
| 端口 | 用途 | 加密方式 | 需要登录 |
|---|---|---|---|
| 25 | 服务器之间转发邮件 | 明文起步,可升级 STARTTLS | 否 |
| 465 | 客户端或应用提交邮件 | 连接即 TLS(隐式 TLS) | 是 |
| 587 | 客户端或应用提交邮件 | 明文起步,必须升级 STARTTLS | 是 |
25:服务器和服务器之间
当 Gmail 要把一封信投给 you@yourcompany.com,它会查你域名的 MX 记录,然后连接对方服务器的 25 端口。这是邮件在互联网上传递的主干,任何收信服务器都必须开放 25。
但它不该被用来从你的电脑或应用里发信。家庭宽带和绝大多数云服务器(阿里云、腾讯云、AWS 等)默认封锁出站 25 端口,因为被入侵的机器最喜欢用它直接发垃圾邮件。这就是「代码在本机能发,部署到服务器就超时」的常见原因。
465:一连上就加密
465 是隐式 TLS:TCP 连接建立后,第一件事就是 TLS 握手,之后才开始说 SMTP。中间没有任何明文阶段,也就不存在被中间人剥掉加密的可能。
它有一段曲折的历史。465 在 1990 年代被分配给 SMTPS,后来又被撤销,大家改用 587 + STARTTLS。直到 2018 年,RFC 8314 重新确认 465 用于邮件提交,并且推荐优先使用隐式 TLS。
587:先明文,再升级
587 的流程是:明文连接 → 客户端发 STARTTLS → 升级成 TLS → 登录 → 发信。只要客户端坚持「服务器不支持 STARTTLS 就断开」,安全性和 465 一样。问题在于,有些老客户端遇到不支持的服务器会悄悄降级回明文。
该用哪个
- 在邮件客户端里配置企业邮箱:用 465,SSL/TLS
- 从应用代码里发信:优先用 HTTP API,其次 465
- 自建收信服务器:必须开放 25 接收外部来信
Rovela 的公网只开放 25(接收外部来信)和 465(邮件提交),587 不对外发布。原因很简单:两个提交端口提供的能力完全一样,只留一个隐式 TLS 的端口,就少一个需要防护的入口。
在 Outlook、Foxmail、iPhone 里添加 Rovela 邮箱:
收信 IMAP mx.rovela.dev 993 SSL/TLS
发信 SMTP mx.rovela.dev 465 SSL/TLS
用户名 完整邮箱地址
密码 在「邮箱 → 凭据」里为这台设备创建的凭据
常见报错
连接超时:多半是出站端口被云厂商封了。先 nc -vz mx.rovela.dev 465 测试能否连通。连 465 都不通,就改用 HTTP API。
wrong version number:TLS 模式选错了。465 要用「SSL/TLS」,587 要用「STARTTLS」,填反了就会握手失败。Node.js 的 nodemailer 里,465 对应 secure: true,587 对应 secure: false。
535 Authentication failed:用户名要写完整邮箱地址,密码要用凭据而不是控制台的登录密码。
为什么应用发信更推荐 HTTP API
HTTP API 走 443 端口,不会被云厂商封锁,一次请求就能拿到邮件 ID,之后还能通过 Webhook 收到送达、退信事件。SMTP 能发,但发完就失去了追踪手段。
curl -X POST https://api.rovela.dev/emails \
-H "Authorization: Bearer re_your_api_key" \
-H "Content-Type: application/json" \
-d '{"from":"Acme <hello@yourdomain.com>","to":"you@example.com","subject":"Hi","html":"<p>Hi</p>"}'