メールソフトや自作のスクリプトから Outlook.com(@outlook.com・@hotmail.com など)に IMAP で接続しようとして、パスワードは合っているのに「AUTHENTICATE failed」と返される。設定を何度見直しても変わらない、というのがこの症状の典型です。
原因の多くは、Outlook.com がパスワードによる「基本認証」を受け付けなくなり、OAuth2 の「先進認証」での接続が必要になったことです。設定を一つずつ確認していけば、接続自体はそれほど難しくありません。
この記事でわかること
- パスワードで IMAP 接続できなくなった理由
- OAuth2 で接続するときのサーバー・ポート・スコープ
- XOAUTH2 の認証文字列の作り方と Python での接続例
- よく出るエラーの意味と対処
パスワードで IMAP 接続できなくなった理由
Microsoft は、ユーザー名とパスワードをそのまま送る「基本認証」の受け付けを段階的に終了してきました。法人向けの Exchange Online では先行して無効化が進み、個人向けの Outlook.com でも、サードパーティのアプリから IMAP・POP・SMTP で接続する際には OAuth2 による認証が求められるようになっています。
基本認証では、パスワードがアプリやサーバーにそのまま保存されます。漏えいすればアカウントそのものを乗っ取られかねません。OAuth2 では、アプリが受け取るのは「この用途で、この期間だけ使える鍵(アクセストークン)」です。パスワード自体はアプリ側に渡らないため、万一トークンが漏れても被害の範囲と期間を限定できます。
つまり「パスワードが間違っている」のではなく、「パスワードという方式が使えなくなった」というのが正しい理解です。アプリ パスワードで回避できたケースもありましたが、今後を考えると OAuth2 に切り替えておくのが確実です。
接続に必要な情報(サーバー・ポート・スコープ)
Outlook.com の個人アカウントで使う主な設定は次のとおりです。2026年10月時点で Microsoft の公式サポートに掲載されている値をもとにしています。
| 項目 | 設定値 |
|---|---|
| IMAP サーバー | outlook.office365.com(ポート 993・SSL/TLS) |
| POP サーバー | outlook.office365.com(ポート 995・SSL/TLS) |
| SMTP サーバー | smtp-mail.outlook.com(ポート 587・STARTTLS) |
| 認証方式 | OAuth2(SASL の XOAUTH2 メカニズム) |
| IMAP 用スコープ | https://outlook.office.com/IMAP.AccessAsUser.All |
| POP / SMTP 用スコープ | https://outlook.office.com/POP.AccessAsUser.All / https://outlook.office.com/SMTP.Send |
| トークンエンドポイント | https://login.microsoftonline.com/consumers/oauth2/v2.0/token |
長期間使うなら、スコープに offline_access を加えます。こうするとリフレッシュトークンが発行され、ユーザーが毎回ログインし直さなくてもアクセストークンを更新できます。リフレッシュトークンと client_id の関係は、Outlook の refresh_token と client_id とはで詳しくまとめています。
アクセストークンを取得するまでの流れ
自分でプログラムを書く場合、トークンを取得するまでの手順は大きく分けて次の4段階です。
- アプリを登録する:Microsoft Entra 管理センター(Azure ポータル)の「アプリの登録」で新しいアプリを作り、サポートするアカウントの種類に「個人用 Microsoft アカウント」を含めます。表示される「アプリケーション (クライアント) ID」が client_id です。
- パブリック クライアントを許可する:デスクトップアプリやスクリプトで使う場合は、「認証」画面でパブリック クライアント フローを有効にします。デバイスコードフローを使うときに必要です。
- ユーザーに同意してもらう:初回だけブラウザでサインインし、IMAP へのアクセスを許可します。このとき要求したスコープが、後で使えるスコープの上限になります。
- トークンを保存・更新する:受け取ったアクセストークンは約1時間で期限が切れます。リフレッシュトークンを使って新しいアクセストークンを取得し、接続のたびに使います。
既存のメールソフトを使う場合は、この手順をソフトが代行してくれます。自分で用意する必要があるのは、主にスクリプトや業務システムから接続するケースです。
XOAUTH2 で IMAP にログインする
IMAP サーバーへは、取得したアクセストークンを XOAUTH2 という形式の文字列にして渡します。文字列の構造は次のとおりで、\x01 は制御文字(SOH)を表します。
user=メールアドレス\x01auth=Bearer アクセストークン\x01\x01
この文字列を Base64 エンコードしたものを、AUTHENTICATE XOAUTH2 コマンドで送ります。Python 標準の imaplib はエンコードを自動で行うので、元の文字列を返す関数を渡すだけで済みます。
import imaplib
def imap_login(email: str, access_token: str) -> imaplib.IMAP4_SSL:
auth = f"user={email}\x01auth=Bearer {access_token}\x01\x01"
imap = imaplib.IMAP4_SSL("outlook.office365.com", 993)
imap.authenticate("XOAUTH2", lambda _: auth.encode())
return imap
imap = imap_login("you@outlook.com", access_token)
imap.select("INBOX", readonly=True)
status, data = imap.search(None, "UNSEEN")
print(status, data)
imap.logout()
user= に入れるアドレスは、トークンを発行したアカウントと一致している必要があります。エイリアス(別名アドレス)で失敗する場合は、メインのアドレスで試してみてください。
メールソフトで使う場合
Thunderbird など、Microsoft の OAuth2 に対応したメールソフトであれば、手動でトークンを用意する必要はありません。アカウント追加の画面で認証方式に「OAuth2」を選ぶと、ブラウザ風のサインイン画面が開きます。そこでサインインして許可すれば、以降はソフトが自動でトークンを更新します。
うまくいかない場合は、次の点を確認してください。
- サーバー名・ポート・暗号化方式が上の表と一致しているか
- 認証方式が「通常のパスワード」のままになっていないか
- 以前に保存したパスワードが残っていて、そちらが優先されていないか
- Outlook.com 側の設定で、POP を使う場合に「POP を使用するデバイスとアプリを許可」がオンになっているか
OAuth2 に対応していない古いソフトは、今後も接続できない可能性が高いと考えてください。IMAP と POP のどちらを選ぶべきか迷ったら、IMAP と POP3 の違いも参考になります。
よくあるエラーと対処
| エラー | 主な原因 | 対処 |
|---|---|---|
AUTHENTICATE failed. | トークンの期限切れ、スコープ不足、user とトークンのアカウント不一致 | IMAP 用スコープでトークンを取り直し、アドレスを確認する |
invalid_grant | リフレッシュトークンの失効、別の client_id での更新 | 発行時と同じ client_id で更新する。失効していれば再同意 |
AADSTS50173 | パスワード変更などでトークンが取り消された | サインインし直して新しいトークンを取得 |
AADSTS65001 | 必要なスコープに同意していない | 同意画面を出してスコープを許可し直す |
AADSTS700016 | client_id が存在しない、またはテナント指定が合っていない | アプリ ID と、個人アカウント対応の設定を確認 |
アクセストークンやリフレッシュトークンは、パスワードと同じくらい重要な情報です。ソースコードに直接書かず、環境変数やシークレット管理の仕組みで保管してください。ログに出力しないことも大切です。
詳しい仕様は、Microsoft の公式ドキュメント「OAuth を使用して IMAP、POP、SMTP 接続を認証する」にも掲載されています。
よくある質問
アプリ パスワードを使えば、今までどおり接続できますか?
一時的に使えることもありますが、Microsoft は基本認証そのものを終了する方針です。長く使う仕組みなら、OAuth2 に移行しておくほうが安全で確実です。
アクセストークンはどれくらいの期間使えますか?
おおむね1時間前後です。期限が切れたらリフレッシュトークンで新しいアクセストークンを取得します。接続のたびに有効期限を確認し、必要なときだけ更新する作りにすると効率的です。
Graph API だけ許可されたトークンで IMAP に接続できますか?
できません。IMAP 接続には IMAP 用のスコープが必要です。Graph の Mail.Read だけが許可されている場合は、Microsoft Graph API でメールを取得する方法のように Graph 経由で読み取ります。
SMTP でメールを送るにも OAuth2 が必要ですか?
はい。送信にも SMTP.Send スコープのトークンを使い、STARTTLS で暗号化してから XOAUTH2 で認証します。
まとめ
- Outlook.com の IMAP は、パスワードではなく OAuth2 で接続する
- サーバーは outlook.office365.com:993、スコープは IMAP.AccessAsUser.All
- XOAUTH2 の文字列は「user=アドレス」「auth=Bearer トークン」を \x01 で区切る
- エラーの多くはスコープ不足・期限切れ・client_id の不一致が原因
OAuth2 での接続に対応した Outlook・Hotmail アカウントは、Hotmail・Outlook(OAuth2対応)のカテゴリでも取り扱っています。



