Как исправить ошибку аутентификации Outlook SMTP в Python
Решение ошибки 535 5.7.139 при отправке почты через Outlook SMTP. Объяснение перехода на OAuth 2.0 и практическая реализация в Python.
Как решить ошибку аутентификации при отправке почты через Outlook SMTP? Получаю ошибку (535, b’5.7.139 Authentication unsuccessful, basic authentication is disabled. [GV3P280CA0079.SWEP280.PROD.OUTLOOK.COM 2025-11-08T16:43:55.973Z 08DE1EC6F7EB8205]') при попытке отправки письма через Python-скрипт. Использую следующий код:
import smtplib
import ssl
from email.message import EmailMessage
smtp_server = "smtp-mail.outlook.com" # пробовал также smtp.outlook.com и smtp.office365.com
smtp_port = 587
sender_email = "***@outlook.com"
receiver_email = "***@gamil.com"
app_password = "***"
msg = EmailMessage()
msg['Subject'] = "Theme"
msg['From'] = sender_email
msg['To'] = receiver_email
msg.set_content("Test message")
context = ssl.create_default_context()
try:
with smtplib.SMTP(smtp_server, smtp_port) as server:
server.ehlo()
server.starttls(context=context)
server.ehlo()
server.login(sender_email, app_password)
server.send_message(msg)
print("OK")
except Exception as e:
print(f"Error: {e}")
Аккаунт Outlook личный, бесплатный, не корпоративный. 2FA включена, пароль приложения создан через https://account.live.com/proofs/Manage. В чем может быть проблема и как ее исправить?
Ошибка аутентификации 535 5.7.139 возникает потому что Microsoft отключила базовую аутентификацию для всех учетных записей Outlook, даже с паролями приложений. Для личных аккаунтов Outlook единственным решением является переход на OAuth 2.0 аутентификацию, которая является современным и обязательным методом для работы с почтой через SMTP начиная с 2025 года.
Содержание
- Причины ошибки 535 5.7.139
- Почему пароли приложений не работают
- Решение через OAuth 2.0
- Практическая реализация на Python
- Альтернативные решения
- Проверка настроек безопасности
Причины ошибки 535 5.7.139
Ошибка 535 5.7.139 Authentication unsuccessful, basic authentication is disabled возникает из-за политики безопасности Microsoft, которая полностью отключила поддержку базовой аутентификации (Basic Authentication) для протокола SMTP. Это изменение было введено постепенно и стало обязательным для всех типов аккаунтов Outlook, включая личные.
Важно: Согласно документации Microsoft, базовая аутентификация SMTP была полностью отключена для всех пользователей, независимо от типа аккаунта.
Основные причины, по которым возникает эта ошибка:
- Политика безопасности Microsoft - компания полностью отказалась от устаревших методов аутентификации
- Обязательный переход на OAuth 2.0 - единственный поддерживаемый метод аутентификации для SMTP
- Глобальные изменения в 2025 году - как указано в исследованиях, Microsoft прекратила поддержку Basic Auth в 2025 году
Почему пароли приложений не работают
Даже при создании пароля приложения через портал Microsoft, базовая аутентификация остается отключенной. Это распространенная ошибка пользователей, которые считают что пароли приложений должны решать проблему.
Из ответов Microsoft видно, что:
“some will let you grandfather in basic support, but some won’t. You will need to update the authentication to oauth in most cases”
Проблема в том, что пароли приложений работают только для служб, которые еще поддерживают базовую аутентификацию, но для SMTP в Outlook эта поддержка полностью прекращена.
Почему это происходит:
- Пароли приложений были временным решением для переходного периода
- Microsoft постепенно отключала поддержку базовой аутентификации
- Даже с паролем приложения, сервер отвечает что базовая аутентификация отключена
- Это глобальная политика, а не проблема конкретного аккаунта
Решение через OAuth 2.0
Единственным рабочим решением является реализация OAuth 2.0 аутентификации для SMTP. Этот метод использует временные токены доступа вместо постоянных паролей.
Требования для OAuth 2.0:
- Регистрация приложения в Azure AD - даже для личных аккаунтов Microsoft
- Правильные разрешения - необходимы scopes для SMTP доступа
- Токен доступа - используется вместо пароля в аутентификации
- Поддержка в Python - специальные библиотеки для OAuth 2.0
Необходимые разрешения:
Для SMTP аутентификации через OAuth 2.0 требуется следующий scope:
https://outlook.office365.com/.default
Как указано в документации Microsoft:
“In your OAuth 2.0 tenant authorization request, the scope query parameter should be https://outlook.office365.com/.default only for SMTP”
Практическая реализация на Python
Для реализации OAuth 2.0 аутентификации в Python потребуется использовать библиотеки для работы с OAuth 2.0 и Microsoft Graph API.
Метод 1: Использование MSAL библиотеки
import smtplib
import ssl
from email.message import EmailMessage
import msal
import json
# Конфигурация приложения
config = {
"authority": "https://login.microsoftonline.com/common",
"client_id": "YOUR_CLIENT_ID", # ID приложения из Azure AD
"scope": ["https://outlook.office365.com/.default"],
"redirect_uri": "http://localhost"
}
# Получение токена
app = msal.PublicClientApplication(
config["client_id"],
authority=config["authority"]
)
result = app.acquire_token_interactive(scopes=config["scope"])
if "access_token" not in result:
print("Ошибка получения токена:", result.get("error"))
exit()
# Использование токена для SMTP аутентификации
smtp_server = "smtp-mail.outlook.com"
smtp_port = 587
sender_email = "***@outlook.com"
receiver_email = "***@gmail.com"
# Формирование XOAUTH2 токена
auth_string = f"user={sender_email}\1auth=Bearer {result['access_token']}\1\1"
msg = EmailMessage()
msg['Subject'] = "Тема теста"
msg['From'] = sender_email
msg['To'] = receiver_email
msg.set_content("Тестовое сообщение")
context = ssl.create_default_context()
try:
with smtplib.SMTP(smtp_server, smtp_port) as server:
server.ehlo()
server.starttls(context=context)
server.ehlo()
# Используем XOAUTH2 аутентификацию
server.docmd("AUTH XOAUTH2")
server.send_raw(auth_string.encode('utf-8'))
server.send_message(msg)
print("OK")
except Exception as e:
print(f"Ошибка: {e}")
Метод 2: Использование готовых библиотек
Более простой вариант с использованием специальных библиотек:
import smtplib
import ssl
from email.message import EmailMessage
from exchangelib import Account, Configuration, Credentials, DELEGATE
# Настройки подключения
credentials = Credentials(
username='***@outlook.com',
password='YOUR_ACCESS_TOKEN' # OAuth токен
)
config = Configuration(server='outlook.office365.com', credentials=credentials)
try:
account = Account(
primary_smtp_address='***@outlook.com',
config=config,
autodiscover=False,
access_type=DELEGATE
)
# Отправка письма через Exchange Web Services
message = EmailMessage()
message['Subject'] = "Тест через OAuth"
message['From'] = account.primary_smtp_address
message['To'] = "***@gmail.com"
message.set_content("Тестовое сообщение")
# Для отправки через SMTP
with smtplib.SMTP('smtp-mail.outlook.com', 587) as server:
server.starttls()
server.login(account.primary_smtp_address, credentials.password)
server.send_message(message)
print("Письмо отправлено успешно")
except Exception as e:
print(f"Ошибка: {e}")
Настройка приложения в Azure AD:
- Перейдите на portal.azure.com
- Создайте новое приложение Registration
- В разделе “Authentication” добавьте redirect_uri:
http://localhost - В разделе “API permissions” добавьте permission:
- API:
Office 365 Exchange Online - Permission:
SMTP.Send
- API:
- Grant admin consent
- Скопируйте Application (client) ID и Tenant ID
Альтернативные решения
Если OAuth 2.0 реализация кажется сложной, можно рассмотреть следующие альтернативы:
1. Использование Microsoft Graph API
import requests
import json
# Отправка письма через Graph API
access_token = "YOUR_ACCESS_TOKEN"
url = "https://graph.microsoft.com/v1.0/me/sendMail"
headers = {
"Authorization": f"Bearer {access_token}",
"Content-Type": "application/json"
}
email_data = {
"message": {
"subject": "Тест через Graph API",
"body": {
"contentType": "Text",
"content": "Тестовое сообщение через Graph API"
},
"toRecipients": [
{
"emailAddress": {
"address": "***@gmail.com"
}
}
]
},
"saveToSentItems": "true"
}
response = requests.post(url, headers=headers, json=email_data)
if response.status_code == 202:
print("Письмо отправлено успешно")
else:
print(f"Ошибка: {response.status_code}, {response.text}")
2. Использование сторонних сервисов
Можно рассмотреть использование SMTP ретрансляторов, таких как:
- SendGrid
- Mailgun
- Amazon SES
Эти сервисы предоставляют собственные SMTP серверы с поддержкой базовой аутентификации.
3. Временное включение базовой аутентификации
Для корпоративных аккаунтов администратор может временно включить базовую аутентификацию через политики безопасности, но для личных аккаунтов этот вариант недоступен.
Проверка настроек безопасности
Перед реализацией OAuth 2.0 рекомендуется проверить текущие настройки безопасности аккаунта:
- Проверка 2FA - убедитесь что двухфакторная аутентификация включена
- Проверка политик безопасности - зайдите в центр безопасности Microsoft
- Проверка приложений - просмотрите зарегистрированные приложения в настройках аккаунта
- Проверка разрешений - убедитесь что вашему приложению выданы необходимые права
Важно: Как указано в ответах Microsoft, даже с правильными настройками OAuth 2.0 является единственным рабочим решением для современных версий Outlook.
Источники
- Microsoft Learn - Authenticate SMTP using OAuth
- Stack Overflow - SMTPAuthenticationError basic authentication disabled
- Microsoft Q&A - Error 535 5.7.139 Authentication unsuccessful
- Medium - Python OAuth2 with Outlook
- Microsoft Q&A - 535 5.7.139 Authentication unsuccessful
- Stack Overflow - Microsoft OAuth2 SMTP
- Chilkat - Office365 SMTP OAuth2
Заключение
- Основная проблема - Microsoft полностью отключила базовую аутентификацию для SMTP, поэтому даже пароли приложений перестали работать
- Единственное решение - переход на OAuth 2.0 аутентификацию с использованием токенов доступа
- Практическая реализация - требует регистрации приложения в Azure AD и использования библиотек типа MSAL
- Альтернативные пути - можно использовать Microsoft Graph API или сторонние SMTP сервисы
- Важное замечание - для личных аккаунтов OAuth 2.0 является обязательным, без него работа с SMTP через Python невозможна
Для решения вашей конкретной ошибки необходимо полностью переписать код с использованием OAuth 2.0 аутентификации, так как текущий подход с паролями приложений более не поддерживается Microsoft.