Blog · Dmarc

Why Your Subdomain Is Silently Blocked by DMARC (Even Though Your Domain Passes)

The Problem in One Sentence

A subdomain with no SPF record inherits DMARC p=reject from your root domain, causing legitimate mail to be silently rejected at the receiving server - no bounce, no alert, no indication that anything went wrong.

What Is Happening - DMARC Alignment Explained

DMARC requires that the domain in the email header From field aligns with either the SPF domain (envelope mail-from) or the DKIM signing domain. This is called alignment.

There are two alignment modes:

  • Relaxed alignment: the organizational domain must match (mail.example.com can align with example.com)
  • Strict alignment: the domains must match exactly

When a subdomain sends email, the envelope mail-from usually shows the subdomain (e.g., sendmail.smtp.example.com or no-reply@mail.example.com), while the From header also shows the subdomain. Under relaxed alignment this should pass - but only if the subdomain has an SPF record that covers the sending IP.

Here is where it breaks. If your root domain has a DMARC policy of p=reject, and a subdomain sends email without its own SPF record, the envelope domain (the subdomain) does not appear in your SPF record. The receiving server checks the subdomain's SPF record, finds nothing, and gets a result of neutral or softfail. Because SPF did not explicitly pass, alignment fails. DMARC sees the From domain and envelope domain as misaligned, and the message is rejected.

The root domain passes DMARC because it does have SPF and DKIM configured. The subdomain fails silently because nobody set up SPF for it.

This is not an edge case. Organizations migrating to p=reject routinely discover forgotten subdomains - often SMTP relays, internal notification systems, or departmental sending tools - that have been silently rejecting for weeks before someone notices.

Why Subdomains Inherit Your DMARC Policy

DMARC has a rule: if a subdomain does not have its own DMARC record, it inherits the policy from the organizational domain above it. This is defined in RFC 7489 and is the default behavior for nearly all receiving servers.

This means:

  • example.com sets v=DMARC1; p=reject; rua=mailto:reports@example.com
  • marketing.example.com has no DMARC record
  • marketing.example.com inherits p=reject automatically

The inheritance works regardless of whether you intended it. If you set p=reject on your root domain to stop spoofing of your brand, every subdomain you have ever used is now also under p=reject - whether those subdomains have proper SPF and DKIM configured or not.

This catches many organizations off guard during DMARC migration. They successfully deploy p=reject on their main domain, everything passes, and then someone reports that transactional emails from their SMTP relay or marketing subdomain have stopped reaching recipients.

Why Silent Rejection Means No Bounce

The most confusing part of this problem is that the sender gets no notification. There is no bounce message, no "mail delivery failed" email, nothing in the sender's inbox.

This is correct behavior under RFC 5321. When an MTA rejects mail at SMTP time - which is what happens when DMARC alignment fails at a strict-enforcing receiver - it must reject the mail during the SMTP transaction. The rejecting server sends a 550 or 554 SMTP reply code to the sending server. It does not generate a new bounce message.

The sending server might log this rejection, or it might not. Many bulk sending systems treat SMTP rejections as transient failures and retry silently. Application-level email (like a web contact form or transactional email from your CRM) often has no retry logic at all and simply discards the message when the SMTP submission fails.

The result: someone tries to send you an email, your server never receives it, and nobody on either side gets a notification. The mail disappears.

This is what practitioners mean when they say DMARC failures are "silent." The failure is recorded in your DMARC aggregate reports, but it produces no application-level alert unless you have monitoring set up specifically for that purpose.

How to Find These Failures in Your DMARC Reports

If you have a DMARC policy of p=reject or p=quarantine and you are receiving RUA reports (aggregate reports), these failures will appear in them.

A DMARC aggregate report for this failure scenario looks something like this:



  
    203.0.113.47
    12
    
      reject
      fail
      fail
    
  
  
    marketing.example.com
    marketing.example.com
  
  
    
      pass
      marketing.example.com
    
    
      neutral
      marketing.example.com
    
  

The key signals in this record:

  • header_from: the subdomain that was used in the From header (marketing.example.com)
  • envelope_from: the subdomain used in the SMTP mail-from (marketing.example.com)
  • spf.result: neutral - because there is no SPF record for marketing.example.com, SPF returns neutral rather than pass
  • dkim.result: pass - DKIM is signing for marketing.example.com and the key validates
  • disposition: reject - because SPF alignment failed even though DKIM passed

The reason this fails: SPF returned neutral instead of pass. Under DMARC alignment, both SPF and DKIM alignment must fail for the message to be evaluated under the "relaxed alignment" alternative. If either alignment passes, the message passes DMARC. But because SPF returned neutral and alignment is being checked against a domain that has no SPF record, the receiving server cannot establish SPF alignment, so DMARC falls back to rejecting.

The fix is to add an SPF record to marketing.example.com covering the IP addresses that send mail from that subdomain.

How to Fix It - Two Options

There are two ways to resolve subdomain DMARC alignment failures. The right choice depends on whether you want to send mail from that subdomain or not.

Option 1: Add SPF record to the subdomain

If you send legitimate email from the subdomain (transactional mail, marketing, automated notifications), add an SPF record that covers all the IPs that send mail from that subdomain:


v=SPF1 mx ip4:203.0.113.0/24 -all

If you use a third-party ESP for that subdomain, include their include mechanism:


v=SPF1 include:_spf.example-esp.com mx -all

After adding the record, verify it propagates using:


dig TXT marketing.example.com +short

Then test a send and check your next DMARC aggregate report. The SPF result should change from neutral to pass, and the disposition should change from reject to none.

Option 2: Set an explicit subdomain DMARC policy

If the subdomain should never send mail, set an explicit DMARC policy of p=none to prevent it from inheriting your strict policy:


_dmarc.marketing.example.com TXT "v=DMARC1; p=none; rua=mailto:reports@example.com"

This tells receivers: "I know this subdomain exists, it is not supposed to send mail, but if it does, treat it with p=none." This is useful for catch-all subdomain records or subdomains used exclusively for web traffic.

Note: p=none on a subdomain that sends mail is not a security configuration - it just means failures are logged but not acted on. Only use this for subdomains that genuinely should not send mail.

How to Monitor for This Automatically

The only way to catch subdomain alignment failures before users report them is to actively read your DMARC RUA reports or use a tool that parses them and alerts you.

Most domain owners never look at their DMARC reports. This is why the silent rejection problem persists for weeks or months before someone notices that a particular subdomain's mail stopped working. The first sign of the problem is usually a user complaint, not a monitoring alert.

The detection workflow matters here: you need a tool that not only parses your RUA reports but actively compares the subdomains in your DMARC data against your known SPF configuration. DMARCFlow does this automatically - it flags any subdomain appearing in DMARC reports that does not have a corresponding SPF record, and sends an alert before the problem becomes a business disruption.

You can also configure DMARCFlow to alert specifically when a subdomain that previously passed DMARC suddenly starts failing, which is often the first sign that a new sending source was added without updating SPF.

FAQ

Why does my domain pass DMARC but my subdomain fails?

Your domain has proper SPF and DKIM configuration. Your subdomain inherits your DMARC policy but has no SPF record, so SPF alignment fails for any mail sent from that subdomain.

Why is there no bounce email when my subdomain mail is rejected?

RFC 5321 requires MTAs to reject mail during the SMTP transaction, not generate a separate bounce message. The sending server receives an SMTP rejection code (550 or 554) during the connection. If your sending system does not log or act on this code, the rejection goes unnoticed.

Should I add SPF to the subdomain or set p=none?

If the subdomain sends legitimate email, add SPF. If the subdomain should never send email, set p=none with an explicit subdomain DMARC record. Do not set p=none on a subdomain that sends mail - that defeats the purpose of DMARC protection for that subdomain.

Does DKIM signing for the subdomain help?

Yes, if the subdomain has DKIM configured and the signing domain matches the From domain under relaxed alignment. But if SPF fails and returns neutral, the receiving server may still fail DMARC alignment depending on its implementation. Both SPF alignment and DKIM alignment must fail for a message to be rejected under relaxed alignment - if either passes, the message passes DMARC.

Can I set a wildcard DMARC record to cover all subdomains at once?

Yes, using the sp tag (subdomain policy) you can set a different policy for subdomains than the main domain. For example: v=DMARC1; p=reject; sp=none; rua=mailto:reports@example.com sets reject for the root domain but none for all subdomains. Use this carefully - it means subdomain failures are only logged, not rejected.