Skip to content

DMARC Setup for a Sending Domain: SPF, DKIM and DMARC Step by Step, from p=none to Reject

Anam Jalal

Founder & CEO, MAJ Leads

Updated 4 Nov 2026 · 9 min read

Quick answer

To set up DMARC, first make SPF and DKIM pass for every service that sends as your domain. Then publish a TXT record at _dmarc.yourdomain reading v=DMARC1; p=none; rua=mailto:an address you read. Read the reports for a month, fix what fails, move to quarantine for another month, and use reject only if your mail flows allow it.

Note

Rule or practice. Rule marks a statement from an RFC or Google page we read on 4 November 2026. Practice marks our advice. The current DMARC specification is RFC 9989 (Proposed Standard, May 2026), which obsoletes RFC 7489. For which providers require what and from what volume, see our post on Google, Yahoo and Microsoft bulk sender rules.

What do SPF, DKIM and DMARC each do?

  • SPF publishes which servers may send mail for a domain. It is one TXT record beginning v=spf1 (RFC 7208, sections 3 and 4.5). It checks the envelope sender (MAIL FROM) and also the HELO identity.
  • DKIM signs each message. The signature names a signing domain (d=) and a selector (s=), and the receiver fetches the public key from a TXT record at selector._domainkey.domain (RFC 6376, sections 3.5 and 3.6).
  • DMARC asks whether SPF or DKIM passed and whether the domain that passed matches the domain in the visible From address. That match is called alignment. If neither aligns, DMARC fails, even when SPF or DKIM passed for some other domain. Google's guidelines say the same: a DMARC pass needs SPF or DKIM to pass and the authenticating domain to match the From domain.

How do you set up SPF?

  1. Practice: list every service that sends mail as your domain: your mailbox provider, your cold email or newsletter tool, your CRM, your invoicing tool, your website forms.
  2. Publish exactly one SPF TXT record at the domain. Rule: RFC 7208 says a domain must not have multiple records that would cause more than one to be selected, and the result is a permanent error if more than one remains.
  3. Add one include for each sender, using the value each provider gives you. Example with placeholder values: v=spf1 include:spf.mailhost.example include:spf.tool.example ~all.
  4. Count the lookups. Rule: include, a, mx, ptr, exists and redirect each count toward a limit of 10 DNS lookups. Going over 10 produces a permanent error, so SPF cannot pass. ip4, ip6 and all do not count.

The qualifier on all is your choice: -all means fail and ~all means softfail (RFC 7208, section 4.6.2). Keep the record to one line and re-check the lookup count each time you add a tool.

How do you set up DKIM?

  1. Turn on DKIM signing in each sending service. The service generates the key pair and gives you a record to publish.
  2. Publish the TXT record at the host the service names, which has the form selector._domainkey.yourdomain. Its value begins v=DKIM1; k=rsa; p= followed by the public key. An empty p= means the key is revoked.
  3. Choose 2048-bit keys where the provider offers them. Rule: RFC 6376 requires signers to use RSA keys of at least 1024 bits for long-lived keys, and Google's sender guidelines require at least 1024 and recommend 2048.
  4. Send a test message to a mailbox you control and look at the full message headers. Practice: the receiving server records whether SPF, DKIM and DMARC passed, and the signing domain should match your From domain.

How do you publish a DMARC record?

Rule. A DMARC record is a TXT record at _dmarc prepended to the domain (RFC 9989, sections 4.1 and 4.5). Start with the monitoring policy, as Google's setup guide advises:

Host: _dmarc.example.com
Type: TXT
Value: v=DMARC1; p=none; rua=mailto:dmarc-reports@example.com
The tags a sending domain needs first (RFC 9989 section 4.7; defaults as the RFC states them)
TagWhat it doesDefault or rule
vVersion. The only valid value is DMARC1, case-sensitiveRequired and must come first, or the whole record is ignored
pPolicy for the domain: none, quarantine or rejectRecommended. If missing from an otherwise valid record, it is treated as none
ruaWhere aggregate reports are sent, as mailto: URIs, comma-separatedWith no rua or ruf, no reports are generated
spPolicy for existing subdomainsIf absent, p applies. np does the same for subdomains that do not exist
adkim, aspfAlignment mode for DKIM and SPF: r (relaxed) or s (strict)Both default to relaxed. Relaxed means the domains share an organizational domain
tTest mode: y or nDefaults to n. With t=y, a receiver applies the policy one level lower

Two practical details. First, the reporting mailbox: Google advises a dedicated group or mailbox, or a third-party reporting service, because the volume can be high, and says that if the report address is on a different domain you must add a DNS record at that domain authorizing it. RFC 9989 section 11.6 gives the same rule and points to RFC 9990 for the mechanism. Second, one record per domain: publish a record for each domain you send from, including any separate sending domain.

If you read older guides, you will see a pct tag that applied the policy to a percentage of mail. Rule: RFC 9989 lists pct as historic and replaces it with the t tag, because pct was usually not applied accurately outside 0 and 100. Google's setup page still describes pct, so both forms are in circulation. Use whichever your DNS and report tools handle, and expect receivers to differ.

How long should you stay at p=none before moving to quarantine and reject?

Rule. RFC 9989 section 7.4 recommends that a domain heading for reject first publish p=none for at least a month, then p=quarantine for an equally long period, comparing the results with the aggregate reports at each step. The meanings come from the same RFC: none states no preference, quarantine says mail that fails should be considered suspicious, and reject says failures are a clear sign the domain is not validly used. What a receiver does with a failure is still the receiver's decision.

A staged rollout following RFC 9989 section 7.4 (the stage lengths are the RFC's; the checks are our practice)
StageRecord valueMinimum timeCheck before moving on
1. Monitorv=DMARC1; p=none; rua=mailto:...A monthEvery legitimate sender passes SPF or DKIM with alignment, and you can explain every other source
2. Quarantinev=DMARC1; p=quarantine; rua=mailto:...A monthNo complaints of missing mail from staff, customers or tools
3. Reject, if suitablev=DMARC1; p=reject; rua=mailto:...OngoingKeep reading reports; add every new sending tool to SPF and DKIM first

Reject is not always right. Rule: RFC 9989 section 7.4 says p=reject can cause problems for alumni forwarders, role-based aliases and mailing lists, and that a domain whose users post to mailing lists should not publish it. A dedicated cold email domain that nobody uses for lists is a better fit than your main company domain. Use test mode (t=y) while you check a change, and remember Google's guidance that a policy of p=none is acceptable for the bulk sender requirement, so a domain that stays at none still satisfies Google's DMARC requirement.

How do you read DMARC reports?

We did not read the report format, which RFC 9989 leaves to a companion document, so this section is practice. The reports are produced by receiving mail systems and sent to your rua address, and they are meant for software rather than people. Google suggests a dedicated mailbox or a third-party reporting service. When you go through what comes back, the questions to ask are two: is any sending source I recognise failing SPF or DKIM alignment, and is any source I do not recognise sending mail as my domain? The first is a setup to fix before you tighten the policy. The second is the reason DMARC exists.

Should a cold email domain have its own DMARC record?

Yes, for each domain that sends. Whether to send cold email from a separate domain is practice, not a rule in any page we read, and Google counts subdomains toward the same primary domain when it works out bulk-sender status, as our bulk sender rules post sets out from Google's FAQ. The sp tag sets a policy for existing subdomains from the parent record. Volume limits and warm-up are in how many cold emails per day.

What does this mean for MAJ Leads?

We are building cold email into MAJ Leads now, so this page is the checklist a sending domain has to pass, not a report on live sending. We have no deliverability results from MAJ sending to publish. Where the product stands today is on how it works, and plans are on pricing.

Sources

Frequently asked questions

What is a DMARC record?
A DMARC record is a TXT record published at _dmarc.yourdomain that tells receivers how to treat mail whose SPF and DKIM do not pass and align with your From domain. It must start with v=DMARC1 and should carry a p= policy of none, quarantine or reject. A rua= address tells receivers where to send reports. The current specification is RFC 9989.
What DMARC policy should I start with?
Start with p=none and a rua address, as Google's setup guide advises. RFC 9989 recommends staying at none for at least a month, then quarantine for an equal period, comparing each stage with the aggregate reports, before considering reject. Google accepts p=none for its bulk sender requirement.
Do I need DMARC if I send fewer than 5,000 emails a day?
Google lists DMARC as a requirement for senders of more than 5,000 messages a day to Gmail, and requires SPF or DKIM from every sender. Many small senders publish DMARC anyway, because it costs little and shows you who else is sending as your domain. Check each provider's own page for its current rule.
Does a DMARC fail mean my email is rejected?
Not by itself. RFC 9989 says a DMARC fail does not require any specific action, and the receiver decides what to do. Your published policy states your preference: none, quarantine or reject. Receivers may still send failing mail to spam or reject it for other reasons.
What replaced RFC 7489 for DMARC?
RFC 9989, published in May 2026 as a Proposed Standard. It obsoletes RFC 7489 and RFC 9091. Among other changes, it marks the pct, rf and ri tags as historic and adds a t tag for test mode. Many guides and tools still describe the older text.

Anam Jalal

Founder & CEO, MAJ Leads

Anam Jalal is the founder of MAJ Leads, a Dubai-based lead management system that puts every paid lead on a rep's phone within about thirty seconds and chases it until it has an answer. He works hands-on with UAE clinics, brokerages and trading companies on lead follow-up, WhatsApp and CRM integrations, and ran voice AI deployments in the UAE before the company focused on lead management.

Read more about Anam

Related articles

Explore our services