Guide
Outlook SMTP 设置:服务器、端口与 TLS
面向开发者的完整 Outlook SMTP 参考:smtp.office365.com 服务器设置、端口 587 与 STARTTLS、Microsoft 自 2022 年 10 月移除 Basic Auth 后的 Modern Auth(OAuth 2.0)要求、Microsoft 365 和 Outlook.com 的发送限制、常见 SMTP 错误代码,以及一个零配置替代方案。
Written by Nick Barraclough Product Manager
本指南用到的命令参考: nylas email send 用于无需 SMTP 发送邮件、 nylas auth login 用于 OAuth 认证、 nylas email list 用于读取邮件。
Outlook SMTP 服务器设置是什么?
Outlook 的 SMTP 服务器是 smtp.office365.com。端口 587 加 STARTTLS 是唯一受支持的配置——Microsoft 已弃用端口 25 的客户端提交,并且对于 Exchange Online,推荐使用端口 587 加 STARTTLS 而非端口 465。认证必须使用 OAuth 2.0 Modern Auth。下表是配置任何 SMTP 客户端或库时完整的 Outlook SMTP 设置速查表。
| 设置项 | 值 |
|---|---|
| SMTP 服务器 | smtp.office365.com |
| 端口 | 587 |
| 加密方式 | STARTTLS(必需) |
| 认证方式 | OAuth 2.0(Modern Auth) |
| 用户名 | 完整邮箱地址(user@domain.com) |
| IMAP 服务器 | outlook.office365.com(端口 993,TLS) |
| POP3 服务器 | outlook.office365.com(端口 995,TLS) |
IMAP 和 POP3 服务器使用与 SMTP 服务器不同的主机名(outlook.office365.com),不少开发者以为两者相同,结果在这里踩坑。根据 Microsoft 的 Exchange Online 文档,SMTP AUTH 必须由租户管理员针对每个邮箱显式启用,新的 Microsoft 365 租户默认禁用该功能。
Microsoft 停用 Basic Auth 如何改变了 SMTP 访问?
Microsoft 于 2022 年 10 月 1 日永久禁用了 Exchange Online 各协议的 Basic Authentication。在此之前,SMTP 客户端可以以明文方式发送用户名和密码(通过 AUTH LOGIN 或 AUTH PLAIN 进行 base64 编码)。停用之后,所有 SMTP 连接都必须通过 XOAUTH2 SASL 机制使用 OAuth 2.0 访问令牌进行认证。这一变化一夜之间让数以千计的脚本、打印机和业务应用停止工作。
要通过 SMTP 以 Modern Auth 发送邮件,你需要一个具有 SMTP.Send 委托权限的 Azure AD 应用注册。令牌请求发往 https://login.microsoftonline.com/{tenant}/oauth2/v2.0/token,并带上 scope=https://outlook.office365.com/.default。访问令牌在 3,600 秒(1 小时)后过期,因此生产代码需要一个刷新令牌循环。下面的示例展示了升级到 STARTTLS 后的 SMTP EHLO 握手。
# SMTP Modern Auth 握手(概念示意)
EHLO client.example.com
STARTTLS
EHLO client.example.com
AUTH XOAUTH2 <base64-encoded-oauth2-token>
# base64 令牌格式:
# user=user@contoso.com^Aauth=Bearer <access_token>^A^A
# 其中 ^A 是 ASCII SOH 字符(0x01)XOAUTH2 令牌格式与标准的 Bearer 头不同。user= 和 auth=Bearer 字段之间用 SOH(0x01)字符分隔,然后整个字符串再做 base64 编码。把这个编码搞错是导致 535 5.7.3 Authentication unsuccessful 错误的头号原因。Microsoft 的 XOAUTH2 文档提供了一个能正确构造该字符串的 Python 示例。
Outlook SMTP 常见错误及修复方法有哪些?
Outlook SMTP 返回 RFC 5321 错误代码,并附带 Microsoft 特有的扩展状态码。5.7.x 系列覆盖认证和授权失败,是 Basic Auth 停用之后最常见的错误类型。下表列出了 Microsoft NDR 参考文档中的 8 个常见错误。
| 错误代码 | 含义 | 修复方法 |
|---|---|---|
| 535 5.7.3 | 认证失败 | 改用 OAuth 2.0 Modern Auth;Basic Auth 已被永久禁用 |
| 550 5.7.501 | 该邮箱的 SMTP AUTH 已禁用 | 管理员需通过 Set-CASMailbox -SmtpClientAuthenticationDisabled $false 启用 SMTP AUTH |
| 550 5.1.1 | 找不到收件人 | 确认收件人地址在目标域中确实存在 |
| 421 4.7.0 | 连接被限流 | 退避 60 秒后重试;降低发送速率 |
| 550 5.7.708 | 租户被禁止发送出站邮件 | 管理员需在 Security & Compliance Center 中解除封锁 |
| 554 5.2.0 | 消息过大 | 将消息大小压缩到 25 MB 以下(35 MB 含 base64 开销 = 约 25 MB 解码后大小) |
| 452 4.5.3 | 收件人过多 | 控制在租户级收件人上限以内(默认值各异,最大 1,000) |
| 550 5.7.520 | 被判定为垃圾邮件 | 检查 SPF、DKIM、DMARC 记录;降低批量发送速率 |
错误 535 5.7.3 是迄今最常见的一个,自 2022 年 10 月以来占了支持工单的大多数。看到它就说明你的代码仍在发送明文用户名和密码。修复方法是注册一个 Azure AD 应用、获取 OAuth 2.0 令牌,并按上一节的描述使用 XOAUTH2 机制。
Microsoft 365 的发送限制是多少?
Microsoft 365 对 SMTP AUTH 提交实施按邮箱和按租户的速率限制。Microsoft 365 商业版计划与免费的 Outlook.com 账户限制不同。超出任一限制都会触发 421 4.7.0 限流响应或 550 拒绝。下表展示了 Microsoft Exchange Online 限制文档中的当前限制。
| 限制项 | Microsoft 365 | Outlook.com |
|---|---|---|
| 每天收件人数 | 10,000 | 因订阅而异 |
| 每封邮件收件人数 | 最多 1,000(管理员可配置) | 100 |
| 每分钟消息数 | 30 | 30 |
| 最大消息体积 | 25 MB | 25 MB |
| 最大附件数 | 250 | 250 |
每分钟 30 条消息的限制经常让构建自动化通知系统的开发者措手不及。它是按邮箱而非按租户计算的上限,因此把发送分散到多个邮箱可以绕开它。对于大批量事务性邮件,Microsoft 推荐使用 Azure Communication Services 资源或第三方 ESP,而不是 SMTP AUTH。
什么时候应该完全跳过 Outlook SMTP?
通过 smtp.office365.com 走 SMTP AUTH 需要 Azure AD 应用注册、OAuth 2.0 令牌管理、XOAUTH2 编码,以及管理员为每个邮箱单独启用。如果你在构建从 Outlook 账户发送邮件的脚本、CI/CD 流水线或开发者工具,这些步骤可以全部跳过。CLI 通过浏览器完成 OAuth 认证、缓存令牌,并自动处理刷新。
下面的示例用 2 条命令从 Outlook 账户发出一封邮件。第一条完成认证并将凭据存储在本地,第二条通过 HTTPS(而非 SMTP)发送消息。没有端口 587,没有 STARTTLS 握手,没有 XOAUTH2 令牌编码,也没有管理员启用步骤。
# 安装(macOS 或 Linux)
brew install nylas/nylas-cli/nylas
# 认证你的 Outlook 账户
nylas auth login --provider microsoft
# 发送一封邮件
nylas email send \
--to recipient@example.com \
--subject "Quarterly report" \
--body "See the attached spreadsheet."
# 列出最近的邮件以验证投递
nylas email list --limit 5同样的命令也适用于 Gmail、Yahoo、iCloud、Exchange 和 IMAP 账户。如果某个遗留系统必须走原生 SMTP,需要 Outlook 专用的 SMTP 设置,请使用本页顶部的速查表。其他场景下,跳过 SMTP 就能避开 Microsoft 停用 Basic Auth 所带来的认证复杂性。
后续步骤
- 用 PHP 发送邮件:mail()、PHPMailer、CLI — 在 PHP 中发送邮件的三种方式
- Gmail SMTP 设置 — 本参考的 Gmail 版本,涵盖端口 587/465 与应用专用密码设置
- 从终端发送 Outlook 邮件 — 无需 Graph API 或 SMTP 即可发送 Outlook 邮件
- 用 PowerShell 收发 Office 365 邮件 — 在 PowerShell 脚本中管理 O365 邮件
- EWS 到 Graph 的迁移 — 在 2026 年 10 月停服之前从 Exchange Web Services 迁移
- 完整命令参考 — 每个标志和子命令的文档