BlueByte
5.7.26Fixed

Gmail rejects your mail with 550-5.7.26: unauthenticated email is not accepted due to the domain's DMARC policy

By Haneul SeoUpdated September 25, 20267 min

Hi, it's BlueByte. Messages your application sent without trouble last week are coming back from Gmail with 550 5.7.26 Unauthenticated email from example.com is not accepted due to domain's DMARC policy. Internal mail still flows, so your mail server is not broken — Gmail is enforcing a policy your own domain published. We'll walk through the message variants, what Gmail checks before it accepts anything, how to read the headers and DNS to find which check failed, the fix for each cause, and how to tighten DMARC later without bouncing your own mail.

The bounce text, and the variant that means something else

Two strings show up here, and they are not the same problem. The first:

550 5.7.26 Unauthenticated email from example.com is not accepted due to
domain's DMARC policy.

Google documents that sentence as the bounce an outgoing message gets when it fails DMARC. Your own mail server usually wraps it in a delivery-status report, and the bounce often continues with a line pointing at the domain's administrator, so the exact wording around it varies by relay.

Your domain publishes a DMARC policy, the message failed DMARC, and Gmail did what the policy asked. The second variant reads This email has been blocked because the sender is unauthenticated. Gmail requires all senders to authenticate with either SPF or DKIM. That one is not about your policy — the message carried no usable authentication, and it is refused under Gmail's baseline sender requirements whether or not a _dmarc record exists. Reading which sentence you got saves an hour in the wrong place.

What Gmail checks before it accepts anything

Since 1 February 2024, Google requires every sender to set up SPF or DKIM for their sending domains, keep spam rates below 0.3%, use a TLS connection for transmitting email, publish valid forward and reverse DNS records for sending domains or IPs, and format messages according to RFC 5322 with a single From: header carrying one address. Senders of more than 5,000 messages a day to Gmail accounts have additional requirements: SPF and DKIM and DMARC together, with the domain in the From: header aligned with either the SPF domain or the DKIM domain, plus one-click unsubscribe on marketing and subscribed messages.

Alignment is the part that surprises people. A message can pass SPF cleanly and still fail DMARC, because SPF validates the envelope sender — the MAIL FROM that becomes the Return-Path — while DMARC compares the header From: domain against whichever domain actually passed. Relay through a vendor that rewrites the Return-Path to its own bounce domain and SPF passes for the vendor, aligning with nothing of yours.

Read the Authentication-Results header to see which check failed

Send one test message down the same path to a Gmail account you control. Under p=quarantine it lands in spam, where the headers are still readable; under p=reject you need a test domain without enforcement, or your aggregate reports instead. Open the message, choose Show original, and read the top of the header block. Field order and the parenthetical comments differ between receivers, so read the values rather than matching the layout:

Authentication-Results: mx.google.com;
       spf=pass (google.com: domain of bounces@vendor.example designates
           198.51.100.20 as permitted sender) smtp.mailfrom=bounces@vendor.example;
       dkim=fail (body hash did not verify) header.i=@example.com;
       dmarc=fail (p=REJECT sp=REJECT dis=REJECT) header.from=example.com

Read it line by line. SPF passed — but for vendor.example, not for the header.from domain. DKIM was present and failed on the body hash. Nothing aligned, so dmarc=fail, and dis=REJECT records the disposition Gmail applied. Google's Admin Toolbox parses this for you with its Messageheader tool if you would rather not read it raw.

Query the three DNS records yourself

The header says which check failed; DNS says why. Three lookups, run from outside your own network so you see what a receiver sees:

dig +short TXT example.com
dig +short TXT _dmarc.example.com
dig +short TXT selector1._domainkey.example.com
"v=spf1 include:_spf.google.com include:mail.vendor.example ~all"
"v=DMARC1; p=reject; rua=mailto:dmarc@example.com; adkim=s; aspf=s"
"v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA..."

Check three things against the header you just read. Is the sending service represented in the SPF record at all? Does the DKIM selector your signer uses actually resolve — a signature naming a selector with no published key cannot verify, however correct the signing is. And are adkim and aspf set to s, which demands strict alignment and refuses the subdomain matches relaxed mode would accept? An empty answer for _dmarc rules the policy variant out, and sends you back to the baseline-authentication bounce.

Fix the cause the header named

Three causes, three fixes:

  • The sending source is not authorized. Confirm that every sending IP address and domain you use appears in the SPF record, then re-send. This is the usual answer when a vendor, a new app server or a migrated relay was added without anyone touching DNS.
  • DKIM does not verify. Either the published key does not match what the signer uses — check that the DKIM key in DNS is the one you added — or the message was modified in transit or after signing, which a mailing list footer or a link-rewriting gateway does on every message. dkim=fail (body hash did not verify) is the modification case; a selector that does not resolve is the publishing case.
  • Both pass, for somebody else's domain. The alignment case. The durable fix is to have the vendor sign with a DKIM selector published under your domain, usually via a CNAME they give you, so the signing domain aligns with your From: whatever the Return-Path says.

A worked example: an invoicing app that started bouncing on a Monday

A finance team's invoicing app has relayed through a third-party service for two years. On Monday every invoice to a Gmail recipient bounces with 5.7.26, while invoices to the company's own Microsoft 365 users arrive normally. The test message shows spf=pass for the vendor's bounce domain, dkim=neutral, dmarc=fail, header.from=example.com. dig +short TXT _dmarc.example.com explains the timing: the security team moved the policy from p=none to p=reject over the weekend. The app had never been aligned — it had simply never been enforced against. The fix is the vendor's DKIM CNAME published under example.com so the signature aligns, verified with a dig against the new selector and then a live send. While DNS propagates, dropping back to p=none for a day stops the bouncing at once.

Verify with a real send, then with the reports

A DNS lookup is not proof — the receiving side has to agree. Send again to a Gmail address you control and check that the header reads dmarc=pass, with either spf=pass or dkim=pass on a domain matching header.from. Then let the reports do the rest: the rua address in your DMARC record receives daily reports identifying which messages failed, which is how you find the sender you forgot about rather than the one that bounced loudly.

Keep it from coming back: report first, enforce second

Most 5.7.26 outages are self-inflicted, and the order of operations prevents them. Publish a policy that only asks for reports, collect them until every legitimate sender shows up aligned — invoicing, ticketing, CRM, monitoring, the marketing platform nobody told you about — and only then tighten to quarantine and reject. Keep a list of which service signs with which selector; that list is what you will want the next time a vendor rotates a key.

How 5.7.26 differs from 5.7.25, 5.7.1 and the 4.7.28 throttles

5.7.25 is reverse DNS, not authentication: the message was blocked because the sending IP address has no PTR record, or the forwarding DNS entry does not reference the sending IP. Fixing SPF will not touch it. 5.7.1 is a family of policy rejections — the sending or receiving domain has a policy prohibiting the mail, or the message has a missing or invalid From: header, no Message-ID, or otherwise fails RFC 5322 — so it points at the message or the recipient's rules, not at your DNS. One more distinction worth holding onto: a 4.7.28 throttle is temporary and a well-behaved sender retries through it, while every code here beginning 5 is permanent and needs a change from you.

Next time Gmail bounces you with 5.7.26, walk these checks back in order: which of the two sentences you actually received, what the Authentication-Results header says about spf, dkim and dmarc, what your three TXT records contain, and which one of them does not match the sender you are troubleshooting.

Related questions

We never published DMARC. Why are we getting 5.7.26?

Check two things. First, which sentence the bounce carries: the one about authenticating with SPF or DKIM is Gmail's baseline requirement for all senders and appears with no DMARC record involved. Second, whether you are sending from a subdomain. A DMARC record on the organizational domain governs subdomains too, and a subdomain policy can be set explicitly, so a record you did not publish at mail.example.com can still be enforced against mail sent from it.

Our SPF passes. Why does DMARC still fail?

Because they check different addresses. SPF validates the envelope sender that appears as the Return-Path, while DMARC requires that the domain in the header From: aligns with either the SPF domain or the DKIM domain. Any relay that rewrites the Return-Path to its own bounce domain produces spf=pass with nothing aligned. Look at smtp.mailfrom and header.from in the Authentication-Results line: if they are different organizational domains and DKIM is not signing for yours, DMARC fails by design.

Do we need DMARC if we send fewer than 5,000 messages a day?

Every sender needs SPF or DKIM — that is the baseline requirement, and skipping it is what produces the unauthenticated-sender bounce. DMARC, alignment with the From: header, and one-click unsubscribe on marketing mail are listed as requirements for senders of more than 5,000 messages a day to Gmail accounts. Publishing DMARC below that threshold is still worth doing, because the aggregate reports are how you find out who is sending as your domain.

Direct mail works but forwarded mail bounces. What changed?

Forwarding changes the path, and sometimes the message. SPF is evaluated against the connecting server, so once a forwarder relays your message, its own IP is what gets checked and your SPF record no longer covers it. DKIM survives forwarding as long as the signed content is untouched, which is why an aligned DKIM signature is the more durable of the two authentication methods. If a forwarder appends a footer or rewrites links, the body hash stops verifying and both checks are gone.

How long after we fix DNS will mail get through?

It depends on the TTL on the records you changed and on what receivers have cached, so there is no single number worth quoting. Verify rather than wait: run dig from a machine outside your network — or a public resolver — until the new value is the one that comes back, then send a real test message and read the Authentication-Results header. The header is the only confirmation that counts, because it reports what the receiving side actually evaluated.

References

Haneul Seo

Infrastructure engineer · 10+ years running Linux fleets

More in this category

AADSTS50011Fixed

Microsoft Entra ID: AADSTS50011, the redirect URI specified in the request does not match the redirect URIs configured for the application

Sign-in completes and then Entra ID refuses the last hop, because the redirect_uri your app sent is not a byte-for-byte match for any URI registered on the app. The match is case-sensitive, counts the trailing slash, requires https outside localhost, and treats the port as significant everywhere except localhost. It also splits by platform: web, spa and publicClient are three separate lists, and URIs added to the service principal instead of the application object can disappear. Read the URI and the app ID out of the error, compare them with az ad app show, add the exact string with az ad app update or a Graph PATCH, then wait three to five minutes.

Microsoft Entra ID
535 5.7.139Workaround

Exchange Online: 535 5.7.139 Authentication unsuccessful, SmtpClientAuthentication is disabled

A scanner, script or app that sends through smtp.office365.com gets 535 5.7.139 because the SMTP AUTH protocol is switched off for the tenant, for that mailbox, or by an authentication policy or security defaults that block Basic authentication. Read the wording (Tenant, Mailbox, or 'did not meet the criteria'), confirm with Get-TransportConfig, Get-CASMailbox and Get-AuthenticationPolicy, then open SMTP AUTH on the one mailbox that needs it rather than tenant-wide. Treat Basic SMTP AUTH as a bridge: Microsoft disables it by default for existing tenants at the end of December 2026, so move the sender to OAuth, High Volume Email or a relay connector.

Exchange Online (Microsoft 365)
Error code: 5003Fixed

Zoom: "Unable to connect" error code 5003 — the desktop app can't reach Zoom while the browser can

Error 5003 is the Zoom desktop app failing to complete its connection to Zoom's servers while the web client on the same machine joins fine. The app needs more than a browser does: Zoom's firewall article lists TCP 443/8801/8802 and UDP 3478/3479/8801–8810 for meetings, a set of CA hosts for certificate validation, and it asks that zoom.us and *.zoom.us be exempted from proxy or SSL inspection. A port test, a curl issuer check, and the app's built-in Network Connectivity Tool (Ctrl+Alt+Shift+D / Cmd+Option+Shift+D) show which of those is cut; fix that layer, and reinstall only when a single machine fails while its neighbours join.

Zoom
Slack cannot connect. / Last updated less than a minute ago…Fixed

Slack: "Slack cannot connect" and the grey "Last updated…" banner behind a corporate proxy

Slack loads channels over ordinary HTTPS but delivers new messages over a persistent WebSocket on port 443 to the three wss-*.slack.com hosts Slack names (primary, backup, mobile). When a proxy or firewall passes the HTTP side and blocks the upgrade — most often because SSL decryption is on for the wss hosts, or the allowlist stops at slack.com — the app shows the grey "Last updated…" banner or "Slack cannot connect." while the browser seems fine. Two curl probes from the affected machine show which layer is blocked; exempt the three wss hosts from decryption, allow every domain on my.slack.com/help/urls, and confirm with my.slack.com/help/test.

Slack
locked for editingFixed

Word: "The document is locked for editing by another user"

Word found a lock — an owner file — for the document and assumed someone else has it open, so it offers only a read-only copy. Usually no one does: a crash left the lock behind, or a hidden Word process is still holding the file. Confirm which, close every Word instance, delete the stale ~$ owner file, and the document opens for editing again.

Microsoft Word
sync error (red X)Fixed

OneDrive: sync stuck — paused or a red X on the icon

A red circle with a white cross, or a paused status, on the OneDrive icon means the sync loop has stopped — your files are safe locally and in the cloud, but they aren't moving between them. Read the activity list to see whether it's the client or one bad file, then restart OneDrive, and reset it if a restart isn't enough. Resetting rebuilds the sync links and doesn't delete files.

OneDrive