Bounce and error codes

550 5.7.1: email rejected per DMARC policy

Last updated 2026-08-14

5.7.1 is the code receivers reach for when they do not want to be specific. If the text next to it mentions DMARC, the fix is alignment on your side, and the recipient cannot help.

The strings you will see

Gmail, on a domain publishing quarantine or reject:

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

A Postfix or Exim host running OpenDMARC, which is most self-hosted receivers:

550 5.7.1 rejected by DMARC policy for example.com

Yahoo, which uses its own wording for policy rejections:

554 5.7.9 Message not accepted for policy reasons

Yahoo moves its codes around more than the others, and its sender hub at senders.yahooinc.com carries the current list. If your bounce text differs by a word, trust the bounce.

What it means. The receiver evaluated DMARC for the domain in your From header, it failed, and that domain's policy is p=quarantine or p=reject with enough of a policy percentage applied to this message to refuse it.

What to change. Make SPF or DKIM pass in alignment with the From domain for the system that sent this. Not the vendor's domain. Yours.

When it clears. Next message after DNS resolves and the sending platform picks up its new signing configuration, which for some platforms takes a verification round of its own.

Confirm it is really DMARC

Three quick checks separate a DMARC rejection from the other things wearing this code.

  1. The text names DMARC, or a policy, or your domain. A 5.7.1 that says Relay access denied is a misconfigured relay and has nothing to do with authentication.
  2. Your domain publishes an enforcing policy. Check it:
    dig +short TXT _dmarc.example.com
    If you get p=none back, the rejection is something else, because p=none asks receivers to deliver anyway.
  3. It fails for one sending system and not others. A tool that sends through your own mail server is usually fine; the tool that sends through a vendor is usually the one.

The DMARC checker reads every tag in the record, including the ones that surprise people: sp= for subdomains, and pct=, which applies the policy to a fraction of messages and produces intermittent rejections that look like flakiness.

The usual causes

  1. A vendor that was never authenticated for your domain. The single biggest one, every time.
  2. A subdomain covered by an inherited policy. p=reject on the parent applies to mail.example.com unless you set sp=. Publishing a separate DMARC record on the subdomain is the clean fix, not weakening the parent.
  3. Strict alignment. If you set aspf=s or adkim=s, an exact domain match is required and a subdomain no longer counts. Most people who set this did not mean to. Alignment, explained covers the difference.
  4. SPF permerror. An SPF record over the lookup limit returns permerror, not pass, so DMARC has only DKIM left to work with. Details here.

Fix

Find the sending system, complete its domain authentication so it signs with d=example.com, and set a custom return-path if it offers one. Retest with a single message to a Gmail address and read Show original. If you cannot identify the system from the bounce, the aggregate reports will name it: how to read one.

If you are mid-rollout and this is breaking real mail, going back to p=none for a week is a legitimate move. It is not a failure. Rolling out DMARC and rolling straight back to reject with a broken sender still in the mix is.

You fixed this sender. Tomorrow the reports name the other hosts still sending as you, and we turn a day of XML into one email with a verdict per sender. On the paid plans, the day a report first names a new sender failing, you hear about it. Get the weekly digest. The first domain is free.

Hear about the next failing sender first

This rejection named one sender, and the next to break sends no warning ahead of it. On a paid plan, the first failing report from a new source reaches you as an email that day, not in Monday's digest. Pro watches 5 domains for $19 a month.

Get the alerts and the digest

No card · 12+ months of history · The free plan does not expire

Questions

Does 550 5.7.1 always mean DMARC?

No. 5.7.1 is the generic 'delivery not authorized' code and also covers relay denied, blocked recipients and content policy. Only treat it as DMARC when the text after the code names DMARC or a policy for your domain.

Whose DMARC policy is being applied, mine or the recipient's?

Yours. The receiving server looks up the DMARC record of the domain in the From header and does what it says. That is why the fix is always on the sending side.

Can the recipient allowlist us to get around it?

Sometimes, at Microsoft and Google via tenant-level overrides, but treat it as a bad answer. It is per-recipient, it hides the real problem, and it does nothing for the next recipient.