Stay organized with collections Save and categorize content based on your preferences.
This document defines the SASL XOAUTH2 mechanism for use with the IMAP AUTHENTICATE
, POP AUTH
, and SMTP AUTH
commands. This mechanism allows the use of OAuth 2.0 Access Tokens to authenticate to a user's Gmail account.
Start by familiarizing yourself with Using OAuth 2.0 to Access Google APIs. That document explains how OAuth 2.0 works, and the steps required to write a client.
You may also want to browse the sample XOAUTH2 code for working examples.
OAuth 2.0 Scopes If your public application uses scopes that permit access to certain user data, it must complete a verification process. If you see unverified app on the screen when testing your application, you must submit a verification request to remove it. Find out more about unverified apps and get answers to frequently asked questions about app verification in the Help Center.The scope for IMAP, POP, and SMTP access is https://mail.google.com/
. If you request access to the full mail scope for your IMAP, POP or SMTP app, it must be in compliance with our Google API Services: User Data Policy.
https://mail.google.com/
.https://mail.google.com/
, migrate to the Gmail API and use more granular restricted scopes.If you intend to use Google Workspace domain-wide delegation using Service Accounts to access Google Workspace users' mailboxes via IMAP, you can authorize your client using the scope https://www.googleapis.com/auth/gmail.imap_admin
instead.
When authorized with this scope, IMAP connections behave differently:
https://mail.google.com/
scope. The SASL XOAUTH2 Mechanism
The XOAUTH2 mechanism allows clients to send OAuth 2.0 access tokens to the server. The protocol uses encoded values shown in the following sections.
Initial Client ResponseThe SASL XOAUTH2 initial client response has the following format:
base64("user=" {User} "^Aauth=Bearer " {Access Token} "^A^A")
Use the base64 encoding mechanism defined in RFC 4648. ^A
represents a Control+A (\001).
For example, before base64-encoding, the initial client response might look like this:
user=someuser@example.com^Aauth=Bearer ya29.vF9dft4qmTc2Nvb3RlckBhdHRhdmlzdGEuY29tCg^A^A
After base64-encoding, this becomes (line breaks inserted for clarity):
dXNlcj1zb21ldXNlckBleGFtcGxlLmNvbQFhdXRoPUJlYXJlciB5YTI5LnZGOWRmdDRxbVRjMk52
YjNSbGNrQmhkSFJoZG1semRHRXVZMjl0Q2cBAQ==
Error Response
An initial client response causing an error results in the server sending a challenge containing an error message in the following format:
base64({JSON-Body})
The JSON-Body contains three values: status
, schemes
, and scope
. For example:
eyJzdGF0dXMiOiI0MDEiLCJzY2hlbWVzIjoiYmVhcmVyIG1hYyIsInNjb3BlIjoiaHR0cHM6Ly9t
YWlsLmdvb2dsZS5jb20vIn0K
After base64-decoding, this becomes (formatted for clarity):
{
"status":"401",
"schemes":"bearer",
"scope":"https://mail.google.com/"
}
The SASL protocol requires clients to send an empty response to this challenge.
IMAP Protocol ExchangeThis section explains how to use SASL XOAUTH2 with the Gmail IMAP server.
Initial Client ResponseTo log in with the SASL XOAUTH2 mechanism, the client invokes the AUTHENTICATE
command with the mechanism parameter of XOAUTH2
, and the initial client response as constructed above. For example:
[connection begins]
C: C01 CAPABILITY
S: * CAPABILITY IMAP4rev1 UNSELECT IDLE NAMESPACE QUOTA XLIST
CHILDREN XYZZY SASL-IR AUTH=XOAUTH2 AUTH=XOAUTH
S: C01 OK Completed
C: A01 AUTHENTICATE XOAUTH2 dXNlcj1zb21ldXNlckBleGFtcGxlLmNvb
QFhdXRoPUJlYXJlciB5YTI5LnZGOWRmdDRxbVRjMk52YjNSbGNrQmhkSFJoZG
1semRHRXVZMjl0Q2cBAQ==
S: A01 OK Success
[connection continues...]
Things to note about the IMAP protocol exchange:
AUTHENTICATE
command is documented in RFC 3501.AUTHENTICATE
command, so that only one round trip is required for authentication. SASL-IR is documented in RFC 4959.AUTHENTICATE
command.AUTHENTICATE
and CAPABILITY
commands are for clarity and would not be present in the actual command data. The entire base64 argument should be one continuous string, with no embedded whitespace, so that the entire AUTHENTICATE
command consists of a single line of text.Authentication failures are also returned via the IMAP AUTHENTICATE
command:
[connection begins]
S: * CAPABILITY IMAP4rev1 UNSELECT IDLE NAMESPACE QUOTA XLIST
CHILDREN XYZZY SASL-IR AUTH=XOAUTH2
S: C01 OK Completed
C: A01 AUTHENTICATE XOAUTH2 dXNlcj1zb21ldXNlckBleGFtcGxlLmNvbQ
FhdXRoPUJlYXJlciB5YTI5LnZGOWRmdDRxbVRjMk52YjNSbGNrQmhkSFJoZG1s
emRHRXVZMjl0Q2cBAQ==
S: + eyJzdGF0dXMiOiI0MDEiLCJzY2hlbWVzIjoiYmVhcmVyIG1hYyIsInNjb
3BlIjoiaHR0cHM6Ly9tYWlsLmdvb2dsZS5jb20vIn0K
C:
S: A01 NO SASL authentication failed
Things to note about the IMAP protocol exchange:
This section explains how to use SASL XOAUTH2 with the Gmail POP server.
Initial Client ResponseTo log in with the SASL XOAUTH2 mechanism, the client invokes the AUTH
command with the mechanism parameter of XOAUTH2
, and the initial client response as constructed above. For example:
[connection begins]
C: AUTH XOAUTH2 dXNlcj1zb21ldXNlckBleGFtcGxlLmNvbQFhdXRoPUJlYX
JlciB5YTI5LnZGOWRmdDRxbVRjMk52YjNSbGNrQmhkSFJoZG1semRHRXVZMjl0
Q2cBAQ==
S: +OK Welcome.
[connection continues...]
Things to note about the POP protocol exchange:
AUTH
command is documented in RFC 1734.AUTH
command are for clarity and would not be present in the actual command data. The entire base64 argument should be one continuous string, with no embedded whitespace, so that the entire AUTH
command consists of a single line of text.Authentication failures are also returned via the POP AUTH
command:
[connection begins]
C: AUTH XOAUTH2 dXNlcj1zb21ldXNlckBleGFtcGxlLmNvbQFhdXRoPUJlY
XJlciB5YTI5LnZGOWRmdDRxbVRjMk52YjNSbGNrQmhkSFJoZG1semRHRXVZMj
l0Q2cBAQ==
S: + eyJzdGF0dXMiOiI0MDAiLCJzY2hlbWVzIjoiQmVhcmVyIiwic2NvcGUi
OiJodHRwczovL21haWwuZ29vZ2xlLmNvbS8ifQ==
SMTP Protocol Exchange
This section explains how to use SASL XOAUTH2 with the Gmail SMTP server.
Initial Client ResponseTo log in with the XOAUTH2 mechanism, the client invokes the AUTH
command with the mechanism parameter of XOAUTH2
, and the initial client response as constructed above. For example:
[connection begins]
S: 220 mx.google.com ESMTP 12sm2095603fks.9
C: EHLO sender.example.com
S: 250-mx.google.com at your service, [172.31.135.47]
S: 250-SIZE 35651584
S: 250-8BITMIME
S: 250-AUTH LOGIN PLAIN XOAUTH XOAUTH2
S: 250-ENHANCEDSTATUSCODES
S: 250 PIPELINING
C: AUTH XOAUTH2 dXNlcj1zb21ldXNlckBleGFtcGxlLmNvbQFhdXRoPUJlY
XJlciB5YTI5LnZGOWRmdDRxbVRjMk52YjNSbGNrQmhkSFJoZG1semRHRXVZMj
l0Q2cBAQ==
S: 235 2.7.0 Accepted
[connection continues...]
Things to note about the SMTP protocol exchange:
AUTH
command is documented in RFC 4954.AUTH
command are for clarity and would not be present in the actual command data. The entire base64 argument should be one continuous string, with no embedded whitespace, so that the entire AUTH
command consists of a single line of text.Authentication failures are also returned via the SMTP AUTH
command:
[connection begins]
S: 220 mx.google.com ESMTP 12sm2095603fks.9
C: EHLO sender.example.com
S: 250-mx.google.com at your service, [172.31.135.47]
S: 250-SIZE 35651584
S: 250-8BITMIME
S: 250-AUTH LOGIN PLAIN XOAUTH XOAUTH2
S: 250-ENHANCEDSTATUSCODES
S: 250 PIPELINING
C: AUTH XOAUTH2 dXNlcj1zb21ldXNlckBleGFtcGxlLmNvbQFhdXRoPUJlYXJl
ciB5YTI5LnZGOWRmdDRxbVRjMk52YjNSbGNrQmhkSFJoZG1semRHRXVZMjl0Q2cB
AQ==
S: 334 eyJzdGF0dXMiOiI0MDEiLCJzY2hlbWVzIjoiYmVhcmVyIG1hYyIsInNjb
3BlIjoiaHR0cHM6Ly9tYWlsLmdvb2dsZS5jb20vIn0K
C:
S: 535-5.7.1 Username and Password not accepted. Learn more at
S: 535 5.7.1 https://support.google.com/mail/?p=BadCredentials hx9sm5317360pbc.68
[connection continues...]
Things to note about the SMTP protocol exchange:
Except as otherwise noted, the content of this page is licensed under the Creative Commons Attribution 4.0 License, and code samples are licensed under the Apache 2.0 License. For details, see the Google Developers Site Policies. Java is a registered trademark of Oracle and/or its affiliates.
Last updated 2025-08-04 UTC.
[[["Easy to understand","easyToUnderstand","thumb-up"],["Solved my problem","solvedMyProblem","thumb-up"],["Other","otherUp","thumb-up"]],[["Missing the information I need","missingTheInformationINeed","thumb-down"],["Too complicated / too many steps","tooComplicatedTooManySteps","thumb-down"],["Out of date","outOfDate","thumb-down"],["Samples / code issue","samplesCodeIssue","thumb-down"],["Other","otherDown","thumb-down"]],["Last updated 2025-08-04 UTC."],[],[]]
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4