直接回答: Outlook / Hotmail 的 OAuth2 令牌邮箱用不了,90% 的问题出在以下四处之一:① 卡密四段拆错(邮箱、密码、client_id、refresh_token 错位或带了空格/换行);② 用 refresh_token 换 access_token 时 client_id、scope 或令牌端点不匹配(常见报错 invalid_grant、AADSTS 开头的错误码);③ IMAP 登录时用错了认证方式或服务器(应使用 XOAUTH2 + outlook.office365.com:993);④ 拿 IMAP 用途的 access_token 去调 Graph(或反过来),导致 401/403。 本文按「先拆卡密 → 再换令牌 → 最后连协议」的顺序逐项排查,适用于本店 Outlook OAuth2|IMAP/GRAPH 双协议 与 Hotmail OAuth2|IMAP/GRAPH 双协议 两款商品,也适用于你自己授权的其他微软个人邮箱。仅讨论正当的收信与自有系统集成场景。
一、先搞清楚:你手里的四段分别是什么
本店两款令牌商品的卡密格式是:
邮箱----密码----client_id----令牌- 邮箱:outlook.com 或 hotmail.com 地址,也是 IMAP / XOAUTH2 里的用户名;
- 密码:邮箱网页登录密码,OAuth2 流程通常用不到,但要保存好;
- client_id:授权时使用的应用 ID(GUID 格式,形如
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx),换令牌时必须用同一个 client_id; - 令牌:即长效 refresh_token,不是可以直接登录 IMAP 的 access_token。它的作用是去微软令牌端点换取有效期约 1 小时的 access_token。
商品页还写明:默认权限为 IMAP,支持心蓝等软件;如遇 Graph 不适配,请添加参数权限 scope:User.Read Mail.Read offline_access。 这句话是后面排查 Graph 报错的关键。概念不熟的话,先读 Hotmail/Outlook令牌邮箱是什么 和 微软邮箱IMAP和GRAPH怎么选怎么填。
二、排查总顺序(建议照着走,别跳步)
- 拆卡密:确认四段完整、无多余空格和换行;
- 单独测试换令牌:用 refresh_token 请求一次 access_token,看返回是成功还是错误码;
- 换令牌成功后再测协议:IMAP 用 XOAUTH2 登录;Graph 调
/me/messages; - 最后才怀疑软件或账号本身。
绝大多数「令牌失效」其实卡在第 1、2 步。
三、第 1 步:卡密拆分常见错误
| 现象 | 原因 | 处理 |
|---|---|---|
| 所有请求都报 invalid_request / 参数缺失 | 用 - 单横线或空格拆分,把 client_id 里的横线也拆开了 | 分隔符是四个连续横线 ----,按它拆成 4 段 |
| invalid_grant,但令牌看起来没问题 | 令牌末尾带了换行符 \r\n 或空格 | 对每一段做 trim;Windows 记事本复制尤其注意 |
| client_id 报找不到应用 | 把邮箱密码当成 client_id 填了(段顺序错位) | 严格按「邮箱、密码、client_id、令牌」顺序 |
| 批量导入部分成功部分失败 | 某几行格式不完整或被文本编辑器自动换行 | 逐行校验段数是否都为 4 |
心蓝等软件的导入格式细节见 心蓝怎么导入Hotmail OAuth2令牌邮箱。
四、第 2 步:refresh_token 换 access_token 报错
微软个人账号(Outlook/Hotmail)常用的令牌端点是:
POST https://login.microsoftonline.com/consumers/oauth2/v2.0/token
(部分工具使用 /common/ 端点,两者对个人账号一般都可用)
grant_type=refresh_token
client_id=<卡密第3段>
refresh_token=<卡密第4段>
scope=<见下文>scope 怎么填:
- 走 IMAP:
https://outlook.office.com/IMAP.AccessAsUser.All offline_access - 走 Graph:
https://graph.microsoft.com/Mail.Read offline_access,或商品页提示的User.Read Mail.Read offline_access(Graph 的简写形式)
常见返回错误与含义:
| 错误 | 常见含义 | 处理思路 |
|---|---|---|
invalid_grant + AADSTS70000 | refresh_token 无效、已被撤销,或与 client_id 不匹配 | 核对 client_id 是否为同一行卡密;确认令牌没被截断 |
invalid_grant + AADSTS70008 | refresh_token 因长期未使用而过期 | 属于令牌已失效,需重新授权;保持定期刷新可避免 |
| AADSTS700016 | 找不到该 client_id 对应的应用 | client_id 填错或段位错位 |
| AADSTS70011 / invalid_scope | scope 格式错误或该应用不支持该权限 | 检查拼写与空格分隔;IMAP 与 Graph 不要混写 |
| AADSTS50076 / 50079 等 | 需要额外验证(MFA)或账号安全策略变化 | 令牌流程无法绕过,需在网页端正常登录处理 |
| AADSTS50034 / 账号不存在 | 邮箱已被删除或输入错误 | 核对邮箱地址 |
| 网络超时 / SSL 错误 | 本地网络或代理问题 | 先排除网络,再判断令牌 |
两个非常容易忽略的点:
- 令牌轮换:换令牌成功时,响应里通常会带一个新的 refresh_token。正确做法是保存新值、下次用新值。一直用旧值,在某些情况下会逐渐失效。
- 密码修改会让令牌失效:如果你登录网页改了邮箱密码或触发了安全验证,原 refresh_token 很可能被撤销。确实需要改密时,要做好重新授权的准备。
一个最小化的自检示例(Python,仅用于测试你自己的令牌是否有效,不要把令牌写进公开代码仓库):
import requests
r = requests.post(
"https://login.microsoftonline.com/consumers/oauth2/v2.0/token",
data={
"grant_type": "refresh_token",
"client_id": CLIENT_ID,
"refresh_token": REFRESH_TOKEN,
"scope": "https://outlook.office.com/IMAP.AccessAsUser.All offline_access",
},
timeout=30,
)
print(r.status_code, r.json().get("error"), r.json().get("error_description", "")[:200])返回 200 且包含 access_token 即说明令牌本身正常,问题在后续协议环节。
五、第 3 步:IMAP 报 AUTHENTICATE failed
换令牌成功但 IMAP 仍然登录失败,按下表检查:
| 检查项 | 正确值 |
|---|---|
| 服务器 | outlook.office365.com |
| 端口 / 加密 | 993 / SSL/TLS |
| 认证方式 | XOAUTH2(不是普通 LOGIN 密码登录) |
| 用户名 | 卡密第 1 段邮箱地址 |
| 令牌 | 刚换到的 access_token(不是 refresh_token) |
| 令牌 scope | 必须是 outlook.office.com/IMAP.AccessAsUser.All |
XOAUTH2 认证串的格式是:user=邮箱\x01auth=Bearer access_token\x01\x01,再做 Base64。常见失败原因:
- 把 refresh_token 直接当密码/令牌塞给 IMAP —— 最常见;
- 拿 Graph scope 换来的 access_token 登录 IMAP —— 受众(audience)不同,必然失败;
- access_token 过期:有效期约 1 小时,长时间运行的程序要在过期前重新刷新;
- 用了普通密码登录:微软个人邮箱已逐步停止基本认证,密码直连 IMAP 基本不可用,这也是令牌邮箱存在的原因。
六、第 4 步:Graph 返回 401 / 403
商品默认权限是 IMAP。如果你要用 Graph API 读取邮件:
- 换令牌时 scope 改为 Graph 权限(商品页提示:
User.Read Mail.Read offline_access); - 请求
GET https://graph.microsoft.com/v1.0/me/messages?$top=5,请求头带Authorization: Bearer <Graph access_token>。
| 状态码 / 错误 | 常见原因 | 处理 |
|---|---|---|
| 401 InvalidAuthenticationToken | 用 IMAP scope 换来的 access_token 调 Graph(受众是 outlook.office.com,不是 graph.microsoft.com) | 用 Graph scope 重新换一次 access_token |
| 401 令牌过期 | access_token 超过约 1 小时 | 用 refresh_token 重新刷新 |
| 403 ErrorAccessDenied / Authorization_RequestDenied | scope 里缺少 Mail.Read 等权限 | 按商品页提示补全 User.Read Mail.Read offline_access 后重新换令牌 |
| 换令牌时 invalid_scope | 该 client_id 未被授予 Graph 权限 | 此时只能继续走 IMAP;Graph 不是所有令牌都保证可用,以商品页说明为准 |
记住一条规则:一个 access_token 只对一个资源有效。 IMAP 和 Graph 要分别用各自的 scope 换各自的 access_token,refresh_token 可以是同一个。两种协议怎么选,详见 archives/70。
七、Outlook 和 Hotmail 的令牌排查有区别吗?
基本没有。两者都是微软个人账号,令牌端点、scope、IMAP 服务器(outlook.office365.com)完全一致,区别只在邮箱域名。唯一要注意的是:如果业务方或脚本限定了域名,买错域是改不了的,区别说明见 Hotmail令牌号和Outlook令牌号有什么区别。
写作时(2026-09-26 21:40 北京时间)两款商品参考信息如下,价格与库存以商品页实时显示为准:
| 商品 | 参考价 | 写作时库存 | 说明 |
|---|---|---|---|
| Outlook微软邮箱-令牌长效/已授权oauth2/IMAP/GRAPH双协议 | ¥0.10 | 有货(约 50 余枚) | outlook.com 域,自动发货 |
| hotmail微软邮箱-令牌长效/已授权oauth2/IMAP/GRAPH双协议 | ¥0.10 | 有货(约 60 余枚) | hotmail.com 域,自动发货 |
购买流程与选域决策见 Hotmail OAuth2怎么买?Outlook令牌与心蓝导入选购;付款后取卡见 自动发卡购买后卡密在哪里看。
八、预防令牌失效的日常习惯
- 到手即测:收到卡密后立刻用第四节的方法测一次换令牌,并用 IMAP 列一次收件箱,有问题趁早按商品页规则反馈;
- 保存轮换后的新 refresh_token,不要永远用发货时的旧值;
- 定期刷新:长期不用的令牌可能因不活跃过期(AADSTS70008),建议定期(例如每几周)刷新一次;
- 不要随意网页登录改密或改安全信息,这类操作可能撤销现有令牌;
- 令牌等同密码:不写入公开仓库、不发群聊、不贴在工单截图里;
- 先单枚验证再批量:确认协议和软件适配后再批量加购。
九、常见问题(FAQ)
Q1:refresh_token 能直接登录 IMAP 吗?
不能。refresh_token 只能用来换 access_token,IMAP 的 XOAUTH2 里填的必须是 access_token。
Q2:换令牌成功,心蓝里却显示失败?
先确认软件版本支持 OAuth2 / XOAUTH2,导入格式与段顺序正确,再看软件是否需要选择 IMAP 或 Graph 模式。步骤见 archives/105。
Q3:用 /common/ 端点和 /consumers/ 端点有区别吗?
对 Outlook/Hotmail 个人账号来说一般都能用;如果一个报错,可以换另一个对比测试,但错误码通常才是关键。
Q4:出现 AADSTS70008 还能救吗?
这表示 refresh_token 因不活跃已经过期,用这个令牌无法再换取 access_token,需要重新授权。因此到手后要及时使用、定期刷新。
Q5:密码那一段有什么用?
OAuth2 流程通常用不到密码,但它是邮箱的网页登录凭据,建议加密保存备用;不要随意用它登录网页改设置,以免令牌被撤销。
Q6:可以用这些令牌邮箱做批量发信吗?
本文只讨论正当的收信、通知接收与自有系统集成。请遵守微软服务条款与当地法律,不要用于垃圾邮件、未授权访问他人邮箱等用途。
十、一页速查
| 卡在哪一步 | 先看什么 |
|---|---|
| 拆卡密 | ---- 分隔、四段、无空格换行 |
| 换令牌 | client_id 同行、scope 对应协议、看 AADSTS 错误码 |
| IMAP | outlook.office365.com:993、XOAUTH2、填 access_token |
| Graph | Graph scope 重新换令牌、补 Mail.Read |
| 概念入门 | archives/63 |
| 新手总清单 | 第一次买成品账号要准备什么?避坑清单 |
评论 (0)