Goodyhop
文章

微软邮箱刷新令牌怎么用?Hotmail / Outlook 收验证码的 3 种方法

拿到「邮箱|密码|刷新令牌|Client ID」这样一行,想收验证码,有三种办法:

  1. 用邮箱和密码登录 outlook.live.com 网页版,最简单。
  2. 用刷新令牌和 Client ID 换一个访问令牌,再通过 IMAP 或 Microsoft Graph 读收件箱,适合要自动化的人。
  3. 把这一行导入邮件管理工具,直接看收件箱。

下面分别讲怎么做、各自要注意什么。

为什么现在收 Hotmail / Outlook 要用刷新令牌

微软已经不让第三方程序只凭用户名和密码连 Outlook 个人邮箱了。微软支持页面写明,从 2024 年 9 月 16 日起,Outlook.com、Hotmail、Live 这些个人邮箱不再支持基本认证(Basic Authentication),第三方邮件客户端必须改用现代认证,也就是 OAuth2(来源:Microsoft 支持)。

刷新令牌(refresh token)是 OAuth2 里的一种长期凭据:程序用它向微软换取短期的访问令牌,再拿访问令牌去读邮件,全程不需要再输密码。所以现在卖的微软邮箱,大多会附上刷新令牌和对应的 Client ID。

发货内容里的四段分别是什么

字段 是什么 用在哪
邮箱 邮箱地址,比如 xxx@hotmail.com 登录名,也是 IMAP 认证时的用户名
密码 账号密码 网页版登录
刷新令牌 OAuth2 的长期凭据,一长串字符 换取访问令牌
Client ID 授权时用的那个应用的编号 换令牌时必须带上,和刷新令牌是配对的

刷新令牌和 Client ID 必须成对使用。换成别的 Client ID,同一个刷新令牌是换不出访问令牌的。

方法一:网页登录 outlook.live.com

打开 outlook.live.com,用邮箱和密码登录,在收件箱里找验证码。只收一两封信的话,这样最省事。

要注意: - 第一次在新设备或新地区登录,微软可能要求额外验证,比如邮箱验证或输验证码。 - 要经常收码的话,每次都登录网页版比较麻烦,可以用方法二或方法三。

方法二:用刷新令牌自己取信(IMAP 或 Graph)

适合会写一点代码、要自动收码的人。流程分两步:

  1. 用刷新令牌和 Client ID 向微软的令牌接口换访问令牌。
  2. 用访问令牌登录 IMAP,或者调 Microsoft Graph 的邮件接口读信。

先看商品标题写的是哪一种:「OAuth2 [IMAP/POP3]」还是「Graph」。换令牌时请求的权限(scope)要和它对上,对不上会换不出令牌或读不了信。

下面是 IMAP 版的最短示例(Python 3,只用标准库):

import imaplib, json, urllib.parse, urllib.request

line = "邮箱|密码|刷新令牌|Client ID"  # 换成发货内容里的一行
email, password, refresh_token, client_id = line.strip().split("|")

data = urllib.parse.urlencode({
    "client_id": client_id,
    "grant_type": "refresh_token",
    "refresh_token": refresh_token,
    "scope": "https://outlook.office.com/IMAP.AccessAsUser.All offline_access",
}).encode()
token = json.load(urllib.request.urlopen(
    "https://login.microsoftonline.com/consumers/oauth2/v2.0/token", data))
access_token = token["access_token"]
# token.get("refresh_token") 是微软返回的新刷新令牌,建议存起来替换旧的

imap = imaplib.IMAP4_SSL("outlook.office365.com", 993)
imap.authenticate("XOAUTH2",
    lambda _: f"user={email}\x01auth=Bearer {access_token}\x01\x01".encode())
imap.select("INBOX")
_, ids = imap.search(None, "ALL")
for i in ids[0].split()[-3:]:  # 最新三封
    _, msg = imap.fetch(i, "(BODY.PEEK[HEADER.FIELDS (FROM SUBJECT DATE)])")
    print(msg[0][1].decode(errors="replace"))
imap.logout()

Graph 版只有两处不同: - 换令牌时 scope 填 https://graph.microsoft.com/Mail.Read offline_access。 - 读信用 HTTP 请求 GET https://graph.microsoft.com/v1.0/me/mailFolders/inbox/messages?$top=5,请求头带 Authorization: Bearer 访问令牌。

Graph 走的是普通的 HTTPS,在连不上 993 端口的网络环境里更方便。

方法三:用邮件管理工具

不想写代码,可以用邮件管理工具。在本站 兑换页 兑换出微软邮箱后: 1. 点「复制为邮件管理工具格式」。 2. 打开页面上的「打开邮件管理工具」。 3. 在工具里选「导入邮箱 → 文本导入」,粘贴进去,就能直接看收件箱和验证码。一次可以导入多行。

要说清楚的一点:邮件管理工具是第三方网站,把刷新令牌粘进去,等于把这个邮箱的收信权限交给了它。用来收注册验证码问题不大;如果邮箱要长期用、要收重要邮件,建议用方法二自己取信。

IMAP 版和 Graph 版怎么选

IMAP / POP3 版 Graph 版
读信方式 标准邮件协议,大多数邮件库、客户端都支持 微软的 HTTP 接口
网络要求 要能连 outlook.office365.com 的 993 端口 普通 HTTPS 就行
适合谁 已经有 IMAP 收信脚本的人 在服务器或云函数里调接口的人

两种都能收验证码,按自己的环境选。微软邮箱的各个版本在 微软邮箱分类,价格和库存以页面为准。需要 Gmail 的可以看 谷歌邮箱分类。

常见问题

微软邮箱的刷新令牌会过期吗?

会。按微软文档,这类应用的刷新令牌默认有效期是 90 天,而且每次使用都会返回一个新的刷新令牌(来源:Microsoft identity platform 文档)。所以只要定期用新令牌替换旧令牌,就能一直用下去。另外,改了密码、账号被要求安全验证之后,旧令牌可能提前失效。

用刷新令牌收不到验证码怎么办?

先确认三件事: - scope 和商品类型(IMAP 或 Graph)对上了。 - Client ID 和刷新令牌是同一行里的。 - 验证码邮件有没有进「垃圾邮件」文件夹。IMAP 版读的是收件箱,垃圾邮件要另外 select("Junk")。

还不行,就到网页版登录看一眼,确认账号没有被要求验证。

拿到邮箱后能改密码、绑手机吗?

能,网页版登录后在微软账户设置里改。但改密码可能让刷新令牌失效,之后要用密码登录网页版收信,或重新授权拿新令牌。

付款后多久能拿到邮箱?

微软邮箱是自动发货,付款后在订单详情里就能看到发货内容。自动交付和人工交付的区别可以看 这篇说明。

风险提示

任何第三方提供的邮箱账号,都可能因为微软的安全策略被要求验证或受限,刷新令牌也可能因为改密码、安全检查而失效。选购前请看清各商品页的质保说明,遇到问题可以在站内提交工单,我们会按商品页写明的售后范围处理。我们不承诺邮箱永久可用,也不建议拿它收重要账户的邮件。