Field note · 2026-10-15 · DME Computer Services
How to set up DMARC in Microsoft 365
Microsoft 365 will send mail from a custom domain with no DKIM signature until you publish two CNAMEs and turn signing on. DMARC for that domain is a TXT record at your DNS host, not a toggle in the admin center.
Do the three records in this order. One SPF TXT record. DKIM, using the CNAME pair the Defender portal shows for this tenant. Then a DMARC TXT record at p=none. The pages below were read on 2026-10-15. If a portal label has moved, the record names on those Learn articles are the part that matters.
The order, without the Microsoft-specific clicks, is How to set up DMARC. Google Workspace is a different console, covered in the Workspace note.
1. One SPF record, with Microsoft's include
SPF is a TXT record on the domain itself. Microsoft's SPF article says most Microsoft 365 organizations need include:spf.protection.outlook.com in that record. Their example, for a domain that also lists two on-premises addresses, is v=spf1 ip4:192.168.0.10 ip4:192.168.0.12 include:spf.protection.outlook.com -all. If you have no on-premises server, you do not invent those ip4 values. A mailbox-only domain is the include plus an enforcement tag.
One record. A second TXT record that also starts with v=spf1 is a permanent error under RFC 7208. A newsletter, a helpdesk, or a scanner gets its include added to this same record. Microsoft's page says -all means hosts you did not list are not authorized. Use ~all only while you are still finding senders, then change it.
include and the other lookup mechanisms are capped at 10 DNS lookups, and lookups inside an include count (RFC 7208 section 4.6.4). Drop includes for products you cancelled.
2. Copy the two DKIM CNAMEs, then enable signing
Microsoft's DKIM article says a custom domain does not get DKIM signing until you configure it. Mail from you@contoso.onmicrosoft.com is signed as that onmicrosoft.com domain. Mail from you@company.com is not signed as company.com until these records exist. DMARC alignment needs the signature d= domain to match the From domain. A signature on the onmicrosoft.com name does not do that job.
The DNS names are always selector1._domainkey and selector2._domainkey. The targets are not something you reconstruct. Microsoft says the examples in the article are illustrations. Domains that picked up the format they introduced in May 2025 point at a name like selector1-company-com._domainkey.yourtenant.n-v1.dkim.mail.microsoft. The letter before -v1 is assigned by Microsoft. Older domains still use selector1-company-com._domainkey.yourtenant.onmicrosoft.com. Both formats are real. Only the pair for this domain is the one you publish.
In the Defender portal, open Email & collaboration, Policies & rules, Threat policies, Email authentication settings, then the DKIM tab. The direct page they document is https://security.microsoft.com/authentication. For a domain whose status is No DKIM keys, their procedure is to try the enable toggle, dismiss the client error, open the domain details, and copy the Publish CNAMEs section. Create those two CNAME records at the DNS host. When Microsoft can see them, turn on "Sign messages for this domain with DKIM signatures."
If you use Exchange Online PowerShell, the command on that page is Get-DkimSigningConfig -Identity company.com | Format-List Name,Enabled,Status,Selector1CNAME,Selector2CNAME. Replace the domain. Only one selector is active. The other is for a later key rotation. You still publish both CNAMEs.
The header's s= value is not always the word selector1. Microsoft's example is s=selector1-contoso-com. The DNS host you create is still selector1._domainkey. Send a new message after signing is on. Old mail is not signed after the fact.
3. Publish DMARC at the DNS host, at p=none
Microsoft's DMARC article says there is no portal or PowerShell cmdlet that manages DMARC for a custom domain. You add the TXT record where the domain's DNS is hosted. The admin-center click path on that page is for the *.onmicrosoft.com domain only.
Start here. Use a shared mailbox, not a person who might leave.
Host: _dmarc Value: v=DMARC1; p=none; rua=mailto:dmarc@company.com
p=none does not ask receivers to junk or reject anything. It asks for reports. Microsoft's rollout is explicit: stay on p=none and read the results, move to p=quarantine, then to p=reject. If you want a smaller first enforcement step, they list pct at 10, then 25, 50, 75, and 100. If you omit pct, it defaults to 100. Do not leave it at 10 and call the policy finished.
Their sample records include ruf=mailto:. The same article says Microsoft 365 does not send forensic reports, even when a valid ruf address is published. Aggregate reports go to a valid rua address when the MX points at Microsoft 365. Read those. A report address on a different domain has to authorize you (RFC 7489 section 7.1). An address on your own domain does not need that extra record.
Subdomains inherit the parent DMARC record unless they have their own. Each subdomain you actually send from still needs its own SPF and DKIM. Microsoft also says a domain you own and do not use for mail should publish v=DMARC1; p=reject; and should not get DKIM CNAMEs.
One more outbound consequence from that page: if your policy is already p=quarantine or p=reject and a destination says your mail failed DMARC, Microsoft routes that outbound mail through the high-risk delivery pool. That is a reason to fix a real sender before you tighten p=, not a reason to skip the policy.
Check the records, or hand the rollout off
/check reads MX, SPF, DMARC, and five common DKIM names, including selector1 and selector2. It stores nothing. It does not open the Defender portal and it does not read aggregate reports. A pass there means the TXT and CNAME names answered. It does not mean a message you sent yesterday was signed.
The $9 report is that same live lookup, written out with a fix for each unfinished row. It is built when a license key from the purchase is present. If the checkout link is not connected, the page says Coming soon. Nothing is stored.
If you want DME Computer Services in Omaha to publish the records and read the aggregate reports for 30 days, that is DMARC setup. $199 is one Google or Microsoft domain. $499 is three domains or extra senders. The rollout starts at monitor mode unless the reports are already clean. Questions go to info@dmeomaha.com.
Sources
Free check · nothing stored
See the records you have now
The checker reads MX, SPF, DMARC, and five common DKIM selectors once. It does not send a message, it does not read DMARC reports, and it does not keep the domain.
From the directory
Report readers and a DNS checker. The notes on each listing are dated from that vendor's page.
- CategoryDMARC, SPF, and DKIMTools that read DMARC reports or help you publish SPF, DKIM, and DMARC so other people cannot send mail as your domain.
- CategoryFree checkersTools with a check or a plan you can use without paying. Trials are not listed here unless a lasting free tier was on the vendor page.
- TooldmarcianDMARC deployment and monitoring, with a 30-day trial and a public domain check.
- ToolEasyDMARCDMARC monitoring with public record checkers and printed prices for the paid plans.
- ToolPostmark DMARCA free weekly DMARC email from Postmark, plus a paid digest at $14 a domain.
- ToolMXToolboxPublic DNS and mail lookups, including MX records and blacklist checks.
The other notes
- How to set up DMARC (step by step)Publish one SPF record and DKIM first. Then a DMARC record at p=none, read the reports, and only then move to quarantine and reject.
- SPF vs DKIM vs DMARC explainedSPF lists who may send. DKIM signs the message. DMARC checks that one of them matches the From address and tells receivers what to do on failure.
- Is my email domain being spoofed? How to tellRead Authentication-Results on a real message and, if you asked for them, the DMARC reports. A DNS lookup alone does not prove an attack today.
- Google Workspace SPF/DKIM/DMARC setupAdd Google's SPF include, generate a DKIM key in the Admin console, and publish DMARC at p=none. Do not paste the strict-alignment sample on day one.
- Why are my emails going to spamA failed SPF, DKIM, or DMARC check, a complaint rate Gmail flags, or a missing PTR or TLS setup can file mail as spam. The wording is not the only cause.
- What is BIMI and do I need itBIMI is an inbox logo for mail that already passes DMARC at quarantine or reject. Gmail also wants a logo certificate. Most small domains can skip it.
- How to spot invoice fraud and business email compromiseA new bank account in an invoice email is unconfirmed until you call a number you already had. DMARC does not stop a lookalike name or a stolen mailbox.
Questions
Short answers to the questions this note is for. The paragraphs above are the longer version.
- Does Microsoft 365 sign my custom domain with DKIM already?
- Not until you turn it on. Microsoft's DKIM page says outbound mail from a custom domain is not DKIM-signed until you configure it. The *.onmicrosoft.com domain is signed for you. Your company.com From address is not, until the two CNAMEs exist and signing is enabled.
- Can I copy the CNAME targets from a blog?
- No. Microsoft's article says its CNAME examples are illustrations. New custom domains, since a format change they date to May 2025, point at a name ending in dkim.mail.microsoft. Older domains still use the onmicrosoft.com target. Copy Selector1CNAME and Selector2CNAME from the Defender portal, or from Get-DkimSigningConfig.
- Where do I paste the DMARC record for a custom domain?
- At the DNS host, as a TXT record named _dmarc. Microsoft's DMARC page says there is no admin-portal control for custom-domain DMARC. The Microsoft 365 admin center path they document is only for the *.onmicrosoft.com domain.
- Will Microsoft send me a forensic report if I set ruf=?
- No. The same page says Microsoft 365 does not send DMARC forensic reports, even when the sender published a ruf address. They do send aggregate reports to a valid rua address when the domain's MX points at Microsoft 365. Read the aggregate reports. Do not wait on ruf.
- Can I start at p=reject?
- Microsoft's rollout section says to start at p=none, then quarantine, then reject, and to use pct if you want a smaller first slice. Their own example of a finished record is p=reject. That is the destination, not the first paste.