В этой статье объясняется, как работает токен обновления для Hotmail/Outlook, зачем он нужен при получении писем через Microsoft Graph, IMAP и POP3 OAuth2, а также как обновить его до истечения срока действия. Материал включает примеры Python-кода для одного аккаунта и массового обновления аккаунтов, подходит для пользователей, которым нужны массовые аккаунты Hotmail, оптовые аккаунты Outlook, прием писем с кодами подтверждения и автоматизированное управление почтой.
Refresh Token является важной частью получения почты Hotmail и Outlook через OAuth2. Если вы используете Microsoft Graph, IMAP OAuth2 или POP3 OAuth2 для чтения писем, Refresh Token помогает поддерживать авторизацию и при необходимости запрашивать новые временные Access Tokens.
Refresh Tokens для аккаунтов Hotmail/Outlook обычно действительны в течение 90 дней с момента создания, поэтому их рекомендуется обновлять до истечения срока действия.
Для пользователей, которые покупают аккаунты Hotmail оптом, приобретают оптовые аккаунты Outlook, получают письма с кодами подтверждения или управляют большим количеством почтовых аккаунтов через автоматизацию, своевременное обновление Refresh Token помогает сократить перебои при входе и повысить стабильность долгосрочного приема почты.
Содержание
Что такое токен обновления
Как Graph, IMAP и POP3 используют токены
Когда нужно обновлять токен обновления
Как обновить токен обновления
Python-пример для одного аккаунта
Python-пример для массового обновления аккаунтов
Автоматическое обновление токенов в сторонних почтовых программах
Важные замечания перед обновлением токенов
1. Что такое токен обновления
Токен обновления (Refresh Token) — это долгосрочный авторизационный ключ, который используется в OAuth2.0.
Проще говоря, пароль подтверждает данные входа в аккаунт, а токен обновления помогает сохранять авторизованный доступ для получения писем. Когда программа читает почту через Graph, IMAP OAuth2 или POP3 OAuth2, она использует токен обновления и Client ID, чтобы получить временный токен доступа.
Токен доступа (Access Token) действует недолго. Он используется для конкретного запроса к почте. Токен обновления действует дольше и позволяет получать новые токены доступа до тех пор, пока сам токен обновления остается действительным.
Аккаунты Hotmail007, которые поддерживают получение почты через токены, обычно выдаются в следующем формате:
email:password:refreshToken:clientId2. Как Graph, IMAP и POP3 используют токены
Graph, IMAP и POP3 — это разные способы получения писем Hotmail/Outlook.
Graph — это современный API Microsoft для доступа к данным Outlook, включая письма, папки и почтовые сообщения. Он часто используется для чтения писем с кодами подтверждения, автоматического получения почты, массового управления аккаунтами Hotmail/Outlook и интеграции с собственными системами.
IMAP и POP3 — это классические почтовые протоколы для получения писем. Если используется OAuth2.0, то для подключения через IMAP или POP3 также нужен токен доступа.
Главная логика простая:
токен обновления используется для поддержания авторизации;
токен доступа используется для фактического доступа к почте;
Graph, IMAP и POP3 используют разные токены доступа;
возможность использовать Graph, IMAP или POP3 зависит от типа аккаунта и подключенных функций.
Если аккаунт Hotmail/Outlook поддерживает только Graph, его нельзя использовать для IMAP-входа. Если аккаунт поддерживает и IMAP, и Graph, актуальный токен обновления можно использовать для получения нужного токена доступа в рамках поддерживаемого способа получения почты.
3. Когда нужно обновлять токен обновления
Токен обновления (Refresh Token) для аккаунтов Hotmail/Outlook обычно действителен в течение 90 дней с момента создания, поэтому его рекомендуется обновлять до истечения срока действия.
Обновлять токен стоит в следующих случаях:
токен скоро истечет;
нужен долгосрочный автоматический прием писем;
вы управляете большим количеством аккаунтов Hotmail или Outlook;
ваш скрипт или система использует Graph, IMAP или POP3 OAuth2;
нужно стабильно получать письма с кодами подтверждения.
Если токен обновления уже истек или был отозван, обновление может завершиться ошибкой. В таком случае потребуется новый действительный токен или новые авторизационные данные аккаунта.
4. Как обновить токен обновления
При запросе токена доступа добавьте offline_access в scope. Если запрос выполнен успешно и в ответе есть новое поле refresh_token, его нужно сохранить.
Для получения почты через Graph обычно используется scope:
https://graph.microsoft.com/.default offline_accessДля IMAP OAuth2:
https://outlook.office.com/IMAP.AccessAsUser.All offline_accessДля POP3 OAuth2:
https://outlook.office.com/POP.AccessAsUser.All offline_accessScope указывает, какой тип токена доступа нужен для текущего сценария. Это не означает, что пользователю нужно вручную хранить несколько разных токенов обновления.
После успешного обновления нужно сохранить новую полную строку аккаунта. В этой строке старый токен обновления уже заменен на новый. Для последующего приема писем, повторного обновления токена или импорта в сторонние инструменты рекомендуется использовать именно новую строку аккаунта.
5. Python-пример для обновления одного аккаунта
Этот пример обновляет токен обновления для одного аккаунта Hotmail/Outlook и выводит новую полную строку аккаунта.
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):
parts = account_line.strip().split(":")
if len(parts) < 4:
raise ValueError("Expected format: email:password:refreshToken:clientId")
email = parts[0]
password = parts[1]
client_id = parts[-1]
refresh_token = ":".join(parts[2:-1])
return email, password, refresh_token, client_id
def update_refresh_token(refresh_token, client_id, scope=DEFAULT_SCOPE):
response = requests.post(
TOKEN_ENDPOINT,
data={
"client_id": client_id,
"grant_type": "refresh_token",
"refresh_token": refresh_token,
"scope": scope,
},
timeout=30,
)
result = response.json()
if response.status_code != 200:
raise RuntimeError(result)
new_refresh_token = result.get("refresh_token")
if not new_refresh_token:
raise RuntimeError("No new refresh_token returned. Please check scope and account status.")
return new_refresh_token, result.get("expires_in")
def main():
account = "email:password:refreshToken:clientId"
email, password, old_refresh_token, client_id = parse_account(account)
new_refresh_token, expires_in = update_refresh_token(old_refresh_token, client_id)
updated_account = f"{email}:{password}:{new_refresh_token}:{client_id}"
print("New account line:")
print(updated_account)
print("Access token expires in:")
print(expires_in)
if __name__ == "__main__":
main()После запуска кода сохраните всю строку, которая выводится под New account line. Эта строка уже содержит новый токен обновления.
6. Python-пример для массового обновления аккаунтов
Если вы управляете большим количеством аккаунтов Hotmail/Outlook, можно поместить их в один файл и обновить токены массово.
Создайте файл:
email_accounts_to_update.txtДобавьте аккаунты по одному в каждой строке:
email1:password:refreshToken:clientId
email2:password:refreshToken:clientId
email3:password:refreshToken:clientIdЗатем используйте следующий Python-код:
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_FILE = Path("email_accounts_to_update.txt")
MAX_WORKERS = 10
RETRY_TIMES = 3
def parse_account(account_line):
parts = account_line.strip().split(":")
if len(parts) < 4:
raise ValueError("Expected format: email:password:refreshToken:clientId")
email = parts[0]
password = parts[1]
client_id = parts[-1]
refresh_token = ":".join(parts[2:-1])
return email, password, refresh_token, client_id
def request_new_refresh_token(refresh_token, client_id, scope=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,
)
result = response.json()
if response.status_code == 200 and result.get("refresh_token"):
return result["refresh_token"]
last_error = result
except Exception as error:
last_error = str(error)
if attempt < RETRY_TIMES:
time.sleep(attempt * 2)
raise RuntimeError(last_error)
def update_account(account_line):
email, password, old_refresh_token, client_id = parse_account(account_line)
new_refresh_token = request_new_refresh_token(old_refresh_token, client_id)
return f"{email}:{password}:{new_refresh_token}:{client_id}"
def main():
account_lines = [
line.strip()
for line in INPUT_FILE.read_text(encoding="utf-8").splitlines()
if line.strip()
]
updated_accounts = []
failed_accounts = []
with ThreadPoolExecutor(max_workers=MAX_WORKERS) as executor:
tasks = {
executor.submit(update_account, account): account
for account in account_lines
}
for task in as_completed(tasks):
original_account = tasks[task]
try:
updated_accounts.append(task.result())
except Exception as error:
failed_accounts.append(f"{original_account} | {error}")
updated_file = Path(f"email_accounts_updated_{len(updated_accounts)}.txt")
failed_file = Path(f"email_accounts_failed_{len(failed_accounts)}.txt")
updated_file.write_text("\n".join(updated_accounts), encoding="utf-8")
failed_file.write_text("\n".join(failed_accounts), encoding="utf-8")
print(f"Total: {len(account_lines)}")
print(f"Updated: {len(updated_accounts)}")
print(f"Failed: {len(failed_accounts)}")
print(f"Updated file: {updated_file}")
print(f"Failed file: {failed_file}")
if __name__ == "__main__":
main()Имя выходного файла будет содержать количество успешно обновленных аккаунтов. Например:
email_accounts_updated_98.txt
email_accounts_failed_2.txtФайл с обновленными аккаунтами можно использовать для дальнейшего приема писем, обслуживания токенов или импорта в вашу систему.
7. Автоматическое обновление токенов в сторонних почтовых программах
Некоторые сторонние программы для приема почты автоматически обновляют токены после импорта аккаунта. В таком случае программа может получать новый токен доступа при каждом чтении писем, а если в ответе возвращается новый токен обновления, она сохраняет его в своей системе.
Поэтому пользователь может не видеть, что токен изменился. Это может происходить автоматически внутри программы.
Hotmail007 также планирует выпустить бесплатное программное обеспечение для приема почты. После импорта аккаунтов программа сможет получать письма и обновлять токены в фоне. Если будет возвращен новый токен обновления, он будет сохранен в системе почтового ПО, чтобы пользователю не приходилось вручную обновлять токены каждый раз.
8. Важные замечания перед обновлением токенов
Перед обновлением токенов Hotmail/Outlook проверьте следующие моменты:
строка аккаунта должна быть полной;
токен обновления и Client ID должны относиться к одному аккаунту;
тип аккаунта должен поддерживать нужный способ получения почты;
аккаунты только с Graph не подходят для IMAP-входа;
после успешного обновления используйте самую новую строку аккаунта;
не публикуйте токены обновления в открытом доступе;
если обновление не удалось, проверьте статус аккаунта, срок действия токена, scope и сетевую среду.
Для массовых аккаунтов Hotmail, оптовых аккаунтов Outlook, приема писем с кодами подтверждения и автоматизированного управления почтой лучше обновлять токены заранее, а не ждать ошибки получения писем.
Заключение
Обновление токена обновления Hotmail/Outlook важно для долгосрочного получения писем через Graph, IMAP и POP3 OAuth2. Основное правило простое: используйте токен обновления и Client ID для запроса нового токена доступа, добавляйте offline_access при обновлении и сохраняйте новый токен обновления, если он возвращается в ответе.
Для пользователей, которым нужны массовые аккаунты Hotmail, оптовые аккаунты Outlook, Graph-получение, IMAP OAuth2, POP3 OAuth2 или автоматическое чтение писем с кодами подтверждения, своевременное обновление токенов помогает сделать работу с аккаунтами более стабильной.