本文介绍 Hotmail/Outlook 邮箱刷新令牌的作用、有效期和更新方法,说明 Graph、IMAP 和 POP3 在 OAuth2.0 收信中的关系。Hotmail/Outlook 账号中的刷新令牌通常自创建起 90 天内有效,建议在到期之前刷新。文章提供单个账号和批量账号更新刷新令牌的 Python 示例代码,并说明第三方收件软件自动刷新令牌的情况,适合批量购买 Hotmail 账号、Outlook 账号批发、验证码邮件读取和自动化收信用户参考。
本文介绍 Hotmail/Outlook 邮箱刷新令牌(Refresh Token)的作用、有效期、更新方式,以及如何在 Graph、IMAP 和 POP3 OAuth2.0 收信场景中维护最新令牌。
如果你正在使用 Hotmail007 提供的 Hotmail/Outlook 邮箱账号,并需要进行验证码邮件读取、Graph 收信、IMAP 收信、POP3 收信、API 自动化或批量邮箱管理,正确维护刷新令牌非常重要。
本文内容
什么是刷新令牌
刷新令牌和访问令牌有什么区别
Graph、IMAP 和 POP3 分别有什么作用
更新出来的新刷新令牌是否通用
如何更新刷新令牌
单个账号更新刷新令牌代码
批量更新刷新令牌代码
Graph、IMAP 和 POP3 的 scope 怎么选择
第三方软件如何自动刷新令牌
Hotmail007 免费收信软件预告
常见问题
1. 什么是刷新令牌?
刷新令牌(Refresh Token)可以理解为长期授权凭证。它不是直接用来读取邮件的,而是用来获取访问令牌(Access Token)。
在 Hotmail/Outlook 邮箱使用场景中,刷新令牌常用于:
微软 Graph 收信
IMAP OAuth2.0 收信
POP3 OAuth2.0 收信
第三方收件工具授权
API 自动化读取邮箱邮件
批量 Hotmail/Outlook 账号管理
简单来说,刷新令牌负责维持授权,访问令牌负责真正访问邮箱。
对于需要长期收信、验证码邮件读取、批量购买 Hotmail 账号、购买 Outlook 账号、Hotmail 账号批发或 Outlook 账号批发的用户来说,刷新令牌是否有效,会直接影响 Graph、IMAP 或 POP3 收信是否稳定。
2. 刷新令牌和访问令牌有什么区别?
访问令牌(Access Token)是临时访问凭证。程序读取邮件、连接 Graph、连接 IMAP 或连接 POP3 时,实际使用的是访问令牌。
刷新令牌是长期授权凭证。访问令牌过期后,程序可以使用刷新令牌获取新的访问令牌。
可以这样理解:
刷新令牌:长期授权,用来获取新的访问权限
访问令牌:临时访问,用来读取邮件或连接邮箱服务
3. Graph、IMAP 和 POP3 分别有什么作用?
微软 Graph(Microsoft Graph)是微软官方 API,可用于读取 Hotmail/Outlook 邮件、联系人、日历等账号数据。Graph 更适合 API 自动化、验证码邮件读取、系统接入和批量收信。
IMAP 是常见邮箱收信协议,适合通过客户端、脚本或第三方工具同步邮箱邮件。IMAP 更适合长期收信、查看邮箱文件夹和保留邮件状态。
POP3 也是邮箱收信协议,主要用于从邮箱服务器拉取邮件。相比 IMAP,POP3 更偏向下载邮件的使用方式。
在 OAuth2.0 场景下,Graph、IMAP 和 POP3 的共同点是:通常都需要先用刷新令牌获取访问令牌,再用访问令牌读取邮件。
4. 更新出来的新刷新令牌是否通用?
很多用户会疑惑:Graph、IMAP 和 POP3 是不是需要不同的刷新令牌?用 Graph 方式更新出来的新刷新令牌,IMAP 是否也可以继续使用?
通俗来说,如果账号本身同时支持 Graph 和 IMAP/POP3,通常可以使用最新的刷新令牌继续维护账号支持的收信功能。
需要真正区分的是访问令牌。Graph、IMAP 和 POP3 需要使用对应的访问令牌,不能混用。
例如:
Graph 收信需要 Graph 对应的访问令牌
IMAP 收信需要 IMAP 对应的访问令牌
POP3 收信需要 POP3 对应的访问令牌
有些 Hotmail/Outlook 账号只有 Graph 功能,有些账号同时支持 IMAP 和 Graph。因此,刷新令牌能用于哪些收信方式,主要取决于账号本身开通了哪些功能。
如果账号只有 Graph 功能,即使提供刷新令牌和 Client ID,也不能使用 IMAP 密码登录或 IMAP 令牌登录。如果账号同时支持 IMAP 和 Graph,新的刷新令牌通常可以继续用于账号支持的收信方式。
5. 如何更新刷新令牌?
Hotmail/Outlook 账号中的刷新令牌(Refresh Token)通常自创建起 90 天内有效,建议在到期之前刷新。
具体有效状态仍以账号状态、授权状态和实际接口返回为准。
更新过程一般是:
使用旧刷新令牌请求 Token 接口
接口返回新的访问令牌
如果请求中包含 offline_access,接口可能同时返回新的刷新令牌
保存新的刷新令牌,并替换旧刷新令牌
后续继续使用新的刷新令牌维护授权
官方文档说明,刷新令牌在使用后可能会返回新的刷新令牌。应用程序应保存新的刷新令牌,并安全删除旧令牌。
需要注意的是,旧刷新令牌不一定会立刻失效。因此你可能会看到旧令牌短时间内仍然可以使用。实际使用时,只要接口返回新的 refresh_token,就建议保存新的刷新令牌。
6. 单个账号更新刷新令牌代码
下面代码适合单个 Hotmail/Outlook 账号更新刷新令牌。它会使用旧刷新令牌请求 Token 接口,如果接口返回新的 refresh_token,就输出包含新令牌的账号信息。
账号格式:
email:password:refreshToken:clientIdPython 示例:
import requests
TOKEN_ENDPOINT = "https://login.microsoftonline.com/consumers/oauth2/v2.0/token"
DEFAULT_SCOPE = "https://graph.microsoft.com/.default offline_access"
def parse_account(account_line: str):
fields = account_line.strip().split(":", 3)
if len(fields) != 4:
raise ValueError("Invalid account format. Expected: email:password:refreshToken:clientId")
email, password, refresh_token, client_id = fields
return email, password, refresh_token, client_id
def request_token_update(refresh_token: str, client_id: str, scope: str = DEFAULT_SCOPE):
response = requests.post(
TOKEN_ENDPOINT,
data={
"client_id": client_id,
"grant_type": "refresh_token",
"refresh_token": refresh_token,
"scope": scope,
},
timeout=30,
)
try:
result = response.json()
except ValueError:
raise RuntimeError(f"Token request failed: {response.text}")
if response.status_code != 200:
error = result.get("error", "unknown_error")
description = result.get("error_description", result)
raise RuntimeError(f"{error}: {description}")
new_refresh_token = result.get("refresh_token")
if not new_refresh_token:
raise RuntimeError("No new refresh_token returned. Please check offline_access, scope, and account status.")
return {
"access_token": result.get("access_token"),
"refresh_token": new_refresh_token,
"expires_in": result.get("expires_in"),
}
def update_account_line(account_line: str, scope: str = DEFAULT_SCOPE):
email, password, old_refresh_token, client_id = parse_account(account_line)
token_result = request_token_update(
refresh_token=old_refresh_token,
client_id=client_id,
scope=scope,
)
updated_account = f"{email}:{password}:{token_result['refresh_token']}:{client_id}"
return updated_account, token_result
if __name__ == "__main__":
account = "email:password:refreshToken:clientId"
updated_account, token_result = update_account_line(account)
print("New account line:")
print(updated_account)
print("Access token expires in:")
print(token_result.get("expires_in"))运行代码后,请保存 New account line 下面输出的整行账号信息。这一行已经把旧刷新令牌替换为接口返回的新刷新令牌。
后续继续收信、再次更新令牌或导入第三方工具时,都建议使用这行最新账号信息。
如果你的账号同时支持 Graph 和 IMAP,后续仍然建议优先使用最新保存的刷新令牌。需要 Graph 收信时,用它获取 Graph 的访问令牌;需要 IMAP 收信时,用它获取 IMAP 的访问令牌。
7. 批量更新刷新令牌代码
如果你有多个 Hotmail/Outlook 账号,可以把账号保存到 email_accounts_to_update.txt,每行一个账号。
标准格式:
email:password:refreshToken:clientId下面代码会批量更新刷新令牌。脚本运行后,成功更新的账号会保存到带数量的结果文件中,例如 email_accounts_updated_98.txt;失败账号会保存到 email_accounts_failed_2.txt,方便快速查看成功和失败数量。
from concurrent.futures import ThreadPoolExecutor, as_completed
from pathlib import Path
import time
import requests
TOKEN_ENDPOINT = "https://login.microsoftonline.com/consumers/oauth2/v2.0/token"
DEFAULT_SCOPE = "https://graph.microsoft.com/.default offline_access"
INPUT_PATH = Path("email_accounts_to_update.txt")
MAX_WORKERS = 10
RETRY_TIMES = 3
def parse_account(account_line: str):
fields = account_line.strip().split(":", 3)
if len(fields) != 4:
raise ValueError("Invalid account format. Expected: email:password:refreshToken:clientId")
email, password, refresh_token, client_id = fields
return email, password, refresh_token, client_id
def request_new_refresh_token(refresh_token: str, client_id: str, scope: str = DEFAULT_SCOPE):
last_error = None
for attempt in range(1, RETRY_TIMES + 1):
try:
response = requests.post(
TOKEN_ENDPOINT,
data={
"client_id": client_id,
"grant_type": "refresh_token",
"refresh_token": refresh_token,
"scope": scope,
},
timeout=30,
)
try:
result = response.json()
except ValueError:
result = {"raw_response": response.text}
if response.status_code == 200 and result.get("refresh_token"):
return result["refresh_token"]
last_error = result
except requests.RequestException as error:
last_error = str(error)
if attempt < RETRY_TIMES:
time.sleep(attempt * 2)
raise RuntimeError(last_error)
def refresh_account_line(account_line: str):
email, password, old_refresh_token, client_id = parse_account(account_line)
new_refresh_token = request_new_refresh_token(
refresh_token=old_refresh_token,
client_id=client_id,
)
return f"{email}:{password}:{new_refresh_token}:{client_id}"
def main():
if not INPUT_PATH.exists():
raise FileNotFoundError(f"Input file not found: {INPUT_PATH}")
account_lines = [
line.strip()
for line in INPUT_PATH.read_text(encoding="utf-8").splitlines()
if line.strip()
]
success_lines = []
failed_lines = []
with ThreadPoolExecutor(max_workers=MAX_WORKERS) as executor:
future_map = {
executor.submit(refresh_account_line, line): line
for line in account_lines
}
for future in as_completed(future_map):
original_line = future_map[future]
try:
success_lines.append(future.result())
except Exception as error:
failed_lines.append(f"{original_line} | {error}")
success_path = Path(f"email_accounts_updated_{len(success_lines)}.txt")
failed_path = Path(f"email_accounts_failed_{len(failed_lines)}.txt")
success_path.write_text(
"\n".join(success_lines) + ("\n" if success_lines else ""),
encoding="utf-8",
)
failed_path.write_text(
"\n".join(failed_lines) + ("\n" if failed_lines else ""),
encoding="utf-8",
)
print(f"Total: {len(account_lines)}")
print(f"Updated: {len(success_lines)}")
print(f"Failed: {len(failed_lines)}")
print(f"Updated accounts saved to: {success_path}")
print(f"Failed accounts saved to: {failed_path}")
if __name__ == "__main__":
main()这段批量代码适合标准账号格式。相比简单脚本,它做了几个优化:
使用更通用的输入和输出文件名,适合 Hotmail 和 Outlook 账号
输出文件名自动带成功或失败数量
支持多线程批量更新
增加请求重试,减少临时网络错误影响
成功和失败结果分开保存
失败时保留原始账号和错误原因,方便排查
不在多个线程里同时写文件,减少文件写入冲突
批量更新时建议控制线程数量,不要请求过快。刷新令牌、Client ID、邮箱账号和密码都属于敏感信息,请勿公开发送或上传到不可信环境。
8. Graph、IMAP 和 POP3 的 scope 怎么选择?
scope 可以理解为这次请求访问令牌时要使用的权限类型。不同收信方式需要的访问令牌不同,所以 scope 也不同。
上面的代码默认使用 Graph scope:
https://graph.microsoft.com/.default offline_access如果你的账号支持 IMAP OAuth2.0,并且你需要获取 IMAP 的访问令牌,可以把 DEFAULT_SCOPE 改成:
https://outlook.office.com/IMAP.AccessAsUser.All offline_access如果你的账号支持 POP3 OAuth2.0,并且你需要获取 POP3 的访问令牌,可以把 DEFAULT_SCOPE 改成:
https://outlook.office.com/POP.AccessAsUser.All offline_access这并不是说要维护多套刷新令牌。对用户来说,重点是保存最新返回的刷新令牌。不同 scope 的作用,是让程序获取不同用途的访问令牌。
如果账号同时支持 Graph 和 IMAP,新的刷新令牌通常可以继续用于账号支持的收信方式。如果账号只有 Graph 功能,就不能使用 IMAP 或 POP3。
9. 第三方软件如何自动刷新令牌?
有些第三方收件软件、邮箱客户端或自动化工具,在用户导入账号后,会自动维护令牌。
它们通常会在后台完成两件事:
使用刷新令牌获取新的访问令牌
如果接口返回新的刷新令牌,就自动保存新的刷新令牌
因此,用户可能看不到刷新过程,也不需要手动复制新的令牌。只要软件支持自动保存新的刷新令牌,并且账号状态正常,就可以减少令牌过期导致的收信中断。
需要注意的是,并不是所有第三方工具都会保存新的刷新令牌。有些工具可能只是刷新访问令牌,短期可以继续收信,但长期使用仍可能遇到刷新令牌到期的问题。
如果你的业务依赖长期收信,建议确认第三方软件是否支持自动保存新的刷新令牌。
10. Hotmail007 免费收信软件预告
Hotmail007 后续计划推出免费收信软件,帮助用户更方便地管理 Hotmail/Outlook 邮箱账号。
用户导入账号后,软件会在后台自动收信,并维护刷新令牌。当接口返回新的刷新令牌时,新的令牌会保存到收件软件后台。用户无需手动复制、更新或定期检查令牌,可以减少刷新令牌过期带来的使用中断。
这对批量购买 Hotmail 账号、购买 Outlook 账号、验证码邮件读取、Graph 收信、IMAP 收信和长期邮箱管理用户会更加友好。
11. 常见问题
刷新令牌更新后一定会变化吗?
不一定每次都能在前端明显看到变化。
官方文档说明,刷新令牌使用后可能会返回新的刷新令牌。实际开发中,如果接口返回了新的 refresh_token,就应该保存新的,并替换旧的。
但旧刷新令牌不一定会立刻失效,所以你可能会看到旧令牌短时间内仍然可以使用。
为什么我更新后只看到访问令牌?
因为很多代码只读取了 access_token,没有读取 refresh_token。
如果只读取 access_token,只是获取了新的访问令牌,并没有保存新的刷新令牌。正确做法是检查接口返回结果中是否包含 refresh_token,并保存新的刷新令牌。
Graph 更新出来的新刷新令牌,IMAP 是否也可以用?
如果账号本身同时支持 Graph 和 IMAP/POP3,通常可以使用最新返回的刷新令牌继续维护这些功能。
但访问令牌不能通用。Graph 收信要请求 Graph 对应的访问令牌,IMAP 收信要请求 IMAP 对应的访问令牌,POP3 收信要请求 POP3 对应的访问令牌。
需要分别更新 Graph 和 IMAP 的刷新令牌吗?
一般不需要把它理解成分别维护多套刷新令牌。
对用户来说,重点是保存最新的刷新令牌。程序在使用不同收信方式时,再根据 Graph、IMAP 或 POP3 的 scope 请求对应的访问令牌。
账号只有 Graph 功能,可以使用 IMAP 吗?
不可以。
有些 Hotmail/Outlook 账号只有 Graph 功能,有些账号同时支持 IMAP 和 Graph。只有 Graph 功能的账号不能使用 IMAP 密码登录,也不能使用 IMAP 令牌登录。
为什么接口没有返回新的 refresh_token?
常见原因包括:
scope 中没有包含 offline_access
当前刷新令牌已经过期或失效
Client ID 与刷新令牌不匹配
账号状态异常
当前请求与账号功能不匹配
请求过快或网络环境异常
如果接口没有返回新的 refresh_token,建议先检查账号格式、刷新令牌、Client ID、scope 和网络环境。
刷新令牌到期前多久更新比较好?
Hotmail/Outlook 账号中的刷新令牌(Refresh Token)通常自创建起 90 天内有效,建议在到期之前刷新。
建议不要等到最后一天再更新,可以提前定期更新,并保存接口返回的新刷新令牌。
对于批量账号,建议使用脚本、第三方软件,或等待 Hotmail007 后续推出的免费收信软件来自动维护令牌。
总结
刷新令牌(Refresh Token)是 Hotmail/Outlook OAuth2.0 收信中的重要授权凭证。它可以用来获取访问令牌(Access Token),并在请求包含 offline_access 时返回新的刷新令牌。
对普通用户来说,最重要的是保存最新的刷新令牌。对开发者来说,需要根据 Graph、IMAP 或 POP3 的使用场景,请求对应 scope 的访问令牌。
如果账号同时支持 IMAP 和 Graph,刷新令牌通常可以维护相关授权;如果账号只有 Graph 功能,则不能用于 IMAP 收信。对于批量购买 Hotmail 账号、购买 Outlook 账号、Hotmail 账号批发和 Outlook 账号批发用户,建议在刷新令牌到期前完成更新,避免长期项目收信中断。