Skills / Email provider auth / References

Verbatim server strings, and what each one means

7 min read

Look up the string you actually received. Tags as in SKILL.md. Where a string below is abbreviated with …, the part shown is the part that carries the diagnosis.

Two rows are not server output, and are marked (client-side): a wrapper string your own library produced. They are here because that is what you will see in your logs, and mistaking one for the server's verdict is a documented way to send a user chasing the wrong fix.

SMTP

StringMeansDo
535 5.7.139 Authentication unsuccessful, SmtpClientAuthentication is disabled for the **Mailbox**.An explicit per-mailbox block. The server resolved the mailbox and matched the token to it, then refused on policy [MEASURED 2026-09-17]Work/school: an admin enables Authenticated SMTP per mailbox. Personal: no lever exists — send through the API instead (microsoft.md §7–8)
535 5.7.139 … SmtpClientAuthentication is disabled for the **Tenant**.The per-mailbox value is unset and inheriting the tenant defaultAn admin sets it per mailbox, which leaves the tenant default off (microsoft.md §6)
535 5.7.139 … basic authentication is disabledA third situation again. [RULE] Match on the sentence, never on 5.7.139Use OAuth
535 5.7.3 Authentication unsuccessfulNo policy sentence → the server refused the identity, not the policy. A different failure from 5.7.139, and the contrast between the two is what proves a 5.7.139 is not a credential problem [MEASURED 2026-09-17]Check the username actually owns the token
535-5.7.8 Username and Password not accepted.[MEASURED] Google: wrong, revoked, or account-rather-than-app passwordgoogle.md
550 5.7.30 Basic authentication is not supported for Client Submission.[VENDOR] Microsoft's SMTP AUTH deprecationUse XOAUTH2
Invalid login: 535 … (client-side)The SMTP library's own prefix, not the server's. [RULE] Classify the policy sentence before any credential regex, or a policy refusal is reported as a bad password—

IMAP

StringMeansDo
* CAPABILITY … AUTH=XOAUTH2 LOGINDISABLED …No password mechanism is offered at all [MEASURED 2026-09-13]Hide the password field. Do not suggest an app password
NO Basic authentication is disabled.Answered to LOGIN and to AUTHENTICATE PLAIN before any account lookup [MEASURED 2026-09-16] — so it is not about this accountOAuth is the only way in
NO User is authenticated but not connected.The token is valid for the mail resource; the mailbox refused the session. On a new Outlook.com mailbox, IMAP access flaps [MEASURED 2026-09-15]Check Settings → Mail → Forwarding and IMAP. Necessary but not sufficient — wait and retry (microsoft.md §7)
NO [AUTHENTICATIONFAILED] Invalid credentials (Failure)The credential is wrong, revoked, or for another accountDistinguish account password from app password by shape, then advise (google.md)
NO [ALERT] Application-specific password required: https://support.google.com/accounts/answer/185833The account password was usedQuote it and add nothing — the provider's own instruction beats yours
NO Incorrect username, password or access token.[MEASURED 2026-09-14] Fastmail's generic refusal—
NO LOGIN failed.Microsoft's answer to a real app password on a real account [VENDOR]Basic auth is gone; use OAuth
Command failed and nothing else (client-side)[MEASURED] The IMAP library's generic wrapper for every tagged NO/BAD. The server's real sentence is on another fieldRead the library's server-text field — responseText in imapflow (runtime-node.md §2; implementation.md §10)

TLS and network

StringMeansDo
Cert does not contain a DNS name / ERR_TLS_CERT_ALTNAME_INVALID, with no server output at all in the dialogueNot a certificate problem. A Happy Eyeballs misfire ran the identity check on a socket that never connected [MEASURED 2026-09-14]app-password-providers.md. Connect one address at a time. Never disable verification
getaddrinfo ENOTFOUND / EAI_AGAIN[VENDOR] The server name could not be resolvedDistinguish from "unsupported provider" — this is retryable
connect ECONNREFUSED[VENDOR] Wrong port, or the service is down—
self signed certificate in chain[VENDOR] A genuine verification failure — often a corporate MITM proxyDo not attach app-password advice to this

OAuth — authorize and token endpoints

StringMeansDo
invalid_grant[VENDOR] Revoked by the user, or a short-lived (7-day, Google Testing) refresh token lapsedSend the human back through consent. Never retry — it is an infinite loop
invalid_request: The provided value for the input parameter 'redirect_uri' is not valid.The registered URI's path does not match. The port is ignored [MEASURED]Register both http://localhost/callback and http://127.0.0.1/callback
invalid_scope: … The scope '…' does not exist.A typo'd or non-existent permissionAlso useful as a calibration probe: it proves the error channel does carry descriptions
AADSTS28000: … scope is not valid because it contains more than one resource.Multi-resource at the token endpoint. Legal at /authorize, illegal at /tokenRedeem per resource (implementation.md §5)
AADSTS65001 / consent_required / DelegationDoesNotExist[VENDOR] No delegated grant exists for this user+resource yetSend an interactive authorization request. On an admin-only permission, this is the admin-consent wall
AADSTS90094: … needs permission to access resources in your organization that only an admin can grant.[VENDOR] A multitenant app registered after 2020-11-08 requesting non-basic permissions from outside its own tenantPick permissions that are not admin-consent-required
AADSTS70011[VENDOR] Two resources in one request, on a work accountAs AADSTS28000
AADSTS70012: MsaServerError - A server error occurred.The closest named code to a bare consumer-side failure. [UNVERIFIED] Whether a descriptionless server_error is this code — no error_codes is returned with it—
error=server_error with no error_description at all[MEASURED 2026-09-17/18] Emitted on the consumer identity leg, 3.9–27.7 s in. Nothing on your side is the causeRun a work-account control. Do not draw scope conclusions while this is happening (microsoft.md §10)

[RULE] Read every redirect field before answering the request — the query string is gone afterwards, and AADSTS numbers live only inside error_description (implementation.md §3).

Microsoft Graph

CodeStatusMeansDo
ErrorAccessDenied403The permission is not granted for this endpoint [MEASURED 2026-09-19]Work the ladder in microsoft.md §9 in order. Confirm the mailbox is not 404 first, and check which endpoint the scope actually authorizes — Mail.Send covers /me/sendMail and nothing else. [MEASURED 2026-09-19] A 403 on GET /me/mailFolders/inbox is expected on a consumer grant and is not the send verdict
ErrorMimeContentInvalidBase64String400Graph authorized the call and then failed to parse the body. On a deliberately invalid probe body this is the pass condition [MEASURED 2026-09-19]microsoft.md §9
MailboxNotEnabledForRESTAPI404[VENDOR] There is no mailbox Graph can see — documented cause is a mailbox on a dedicated Exchange Server rather than a valid Microsoft 365 mailboxAny send verdict from this account is void, not negative. Fix the mailbox or the licence first
UnknownError with an empty message401This token is not accepted for this endpoint. Either you sent the mail token instead of the API token, or the grant lacks the scope this endpoint needs. [MEASURED 2026-09-19] A valid Graph token holding only Mail.Send answers exactly this on GET /meDo not read it as "the token is bad". Check scope matching (implementation.md §6) and confirm against an endpoint the grant does cover. On an account paired before the scope existed: remove and re-add
—429Throttled[RULE] Retry a GET; never re-issue a send. The server may have acted on the first one
—202Accepted. [VENDOR] "doesn't indicate that the request processing has completed"Do not treat as delivery confirmation

Two verdicts that are not errors, and must not be recorded as failures

  • A timeout, or any status you did not plan for. "Could not tell" is its own outcome. Recording it as "the mailbox refuses to send" clears or sets a real flag on the strength of a network hiccup.
  • A 403 from an account with no mailbox. [MEASURED 2026-09-19] An account without an Exchange Online licence answers 403 to everything. Always confirm the mailbox is visible before concluding anything about a permission.