{"id":5207,"date":"2026-08-06T12:24:04","date_gmt":"2026-08-06T12:24:04","guid":{"rendered":"https:\/\/www.mailercloud.com\/blog\/?p=5207"},"modified":"2026-08-06T12:24:06","modified_gmt":"2026-08-06T12:24:06","slug":"spf-dkim-dmarc-implementation-guide","status":"publish","type":"post","link":"https:\/\/www.mailercloud.com\/blog\/spf-dkim-dmarc-implementation-guide","title":{"rendered":"How to Set Up SPF, DKIM &#038; DMARC: Implementation Guide"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Email authentication stopped being optional in February 2024, when Google began enforcing requirements on any domain sending close to 5,000 or more messages a day to personal Gmail accounts; Yahoo aligned the same month but publishes no volume threshold. Microsoft followed on 5 May 2025 with a 5,000\/day threshold for Outlook.com, Hotmail and Live.com. Microsoft&#8217;s own announcement is internally inconsistent on the action taken \u2014 an April 2025 revision states a decision to reject, while surrounding text still describes Junk-foldering first with rejection &#8220;at a date to be announced,&#8221; a date never announced. Senders report both behaviors; the rejection reads:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><em>550 5.7.515 Access denied, sending domain [SendingDomain] does not meet the required authentication level<\/em><\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Enforcement has tightened since. Google&#8217;s FAQ states that &#8220;Starting November 2025, Gmail is ramping up its enforcement on non-compliant traffic,&#8221; and that non-compliant messages &#8220;will experience disruptions, including temporary and permanent rejections.&#8221; Google published no per-code cutover, so treat this as a directional escalation rather than a documented 421\u2192550 flip.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The shared baseline is SPF and DKIM both configured and passing, a published DMARC record (<code>p=none<\/code> is sufficient at Google and Yahoo), at least one of SPF or DKIM aligned to the visible From domain, and valid forward and reverse DNS on your sending IPs. Providers diverge from there: <strong>Google requires TLS; Yahoo&#8217;s published requirements do not mention it<\/strong> \u2014 send over TLS regardless. <a href=\"https:\/\/support.google.com\/mail\/answer\/81126\" rel=\"nofollow\">Google caps spam rate at <strong>0.30%<\/strong><\/a> as reported in Postmaster Tools and Yahoo states the same figure via <a href=\"https:\/\/senders.yahooinc.com\/\" rel=\"nofollow\">Sender Hub<\/a>; treat 0.10% as your working limit. Google and Yahoo both require one-click unsubscribe (<a href=\"https:\/\/www.rfc-editor.org\/rfc\/rfc8058\" rel=\"nofollow\">RFC 8058<\/a>) honored within two days; Microsoft&#8217;s published requirements cover authentication only.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This page is the implementation reference. For the receiver-side rules themselves, see <a href=\"https:\/\/www.mailercloud.com\/blog\/gmail-yahoo-sender-requirements\">the current Gmail and Yahoo sender requirements<\/a> and <a href=\"https:\/\/www.mailercloud.com\/blog\/microsoft-outlook-sender-requirements\">Microsoft&#8217;s own 5,000\/day rule and 550 5.7.515<\/a>.<\/p>\n\n\n\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_88 counter-hierarchy ez-toc-counter ez-toc-custom ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Table of Contents<\/p>\n<span class=\"ez-toc-title-toggle\"><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/www.mailercloud.com\/blog\/spf-dkim-dmarc-implementation-guide\/#How_SPF_DKIM_and_DMARC_Fit_Together\" >How SPF, DKIM and DMARC Fit Together<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/www.mailercloud.com\/blog\/spf-dkim-dmarc-implementation-guide\/#Copy-Paste_Record_Reference\" >Copy-Paste Record Reference<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/www.mailercloud.com\/blog\/spf-dkim-dmarc-implementation-guide\/#SPF_Implementation\" >SPF: Implementation<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/www.mailercloud.com\/blog\/spf-dkim-dmarc-implementation-guide\/#DKIM_Implementation\" >DKIM: Implementation<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/www.mailercloud.com\/blog\/spf-dkim-dmarc-implementation-guide\/#DMARC_Implementation\" >DMARC: Implementation<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/www.mailercloud.com\/blog\/spf-dkim-dmarc-implementation-guide\/#How_to_Validate_Your_Setup\" >How to Validate Your Setup<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/www.mailercloud.com\/blog\/spf-dkim-dmarc-implementation-guide\/#Reading_DMARC_Reports_Without_Drowning\" >Reading DMARC Reports Without Drowning<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/www.mailercloud.com\/blog\/spf-dkim-dmarc-implementation-guide\/#Common_Implementation_Mistakes_Ranked\" >Common Implementation Mistakes, Ranked<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/www.mailercloud.com\/blog\/spf-dkim-dmarc-implementation-guide\/#How_Mailercloud_Handles_Authentication\" >How Mailercloud Handles Authentication<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/www.mailercloud.com\/blog\/spf-dkim-dmarc-implementation-guide\/#FAQ_SPF_DKIM_and_DMARC_Implementation\" >FAQ: SPF, DKIM and DMARC Implementation<\/a><\/li><\/ul><\/nav><\/div>\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"How_SPF_DKIM_and_DMARC_Fit_Together\"><\/span>How SPF, DKIM and DMARC Fit Together<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>SPF is the path check.<\/strong> The receiver takes the domain in the SMTP envelope sender (the <code>MAIL FROM<\/code>, also called Return-Path or bounce address), looks up its SPF record, and checks the connecting IP against it.<\/li>\n\n\n\n<li><strong><a href=\"https:\/\/www.rfc-editor.org\/rfc\/rfc6376\" rel=\"nofollow\">DKIM<\/a> is the signature check.<\/strong> The sender signs selected headers and the body with a private key; the receiver fetches the public key from DNS and verifies. A valid signature proves the signing domain vouched for the message and that the signed parts survived transit intact.<\/li>\n\n\n\n<li><strong>DMARC is the policy and alignment layer.<\/strong> It asks whether either passing check belongs to the domain the human sees \u2014 and tells the receiver what to do when the answer is no.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Alignment is the part most people get wrong<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">SPF and DKIM can both pass on a message that is unambiguously forged, because neither looks at the From header \u2014 the only address the recipient sees. A spammer can register <code>evil-domain.net<\/code>, publish a valid SPF record for their own server, DKIM-sign with their own key, and put <code>billing@yourbank.com<\/code> in the From header. Both checks pass.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">DMARC closes that gap by requiring <strong>alignment<\/strong>: the domain that passed SPF or DKIM must match the From header domain. SPF alignment compares the From domain against the <code>MAIL FROM<\/code> domain; DKIM alignment compares it against the signature&#8217;s <code>d=<\/code> domain. DMARC passes if <em>either<\/em> aligns \u2014 you do not need both.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Alignment has two modes, set per-mechanism. Relaxed (<code>aspf=r<\/code> \/ <code>adkim=r<\/code>, the default) accepts an organizational-domain match, so <code>mail.example.com<\/code> aligns with <code>example.com<\/code>. Strict (<code>s<\/code>) requires an exact match.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This is why the most common authentication failure looks like a paradox: SPF passes, DKIM passes, DMARC fails. Almost always the cause is an ESP using its own bounce domain in the envelope while signing with its own <code>d=<\/code> domain instead of yours. Both checks pass on the ESP&#8217;s domain; neither is aligned with yours. <strong>The fix is a custom return-path subdomain, a DKIM key signing as your domain, or preferably both.<\/strong><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Copy-Paste_Record_Reference\"><\/span>Copy-Paste Record Reference<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Substitute your own domain, selector and provider includes. Every mechanism is annotated.<\/p>\n\n\n\n<!--\n  TABLE 1 \u2014 Copy-paste record reference (SPF\/DKIM\/DMARC implementation post)\n  Paste into a WordPress \"Custom HTML\" block. All styles inline; no theme CSS needed.\n  Navy header #1F3A5C \u00b7 striped rows #F5F6F7\/#FFFFFF \u00b7 DNS values in monospace chips\n-->\n<div style=\"overflow-x:auto;border:1px solid #EAECEF;border-radius:8px;margin:24px 0;\">\n  <table style=\"width:100%;border-collapse:collapse;min-width:900px;font-family:inherit;\">\n    <thead>\n      <tr>\n        <th style=\"background:#1F3A5C;color:#ffffff;text-align:left;font-weight:700;font-size:14px;letter-spacing:.2px;padding:16px 18px;font-family:inherit;\">Record<\/th>\n        <th style=\"background:#1F3A5C;color:#ffffff;text-align:left;font-weight:700;font-size:14px;letter-spacing:.2px;padding:16px 18px;font-family:inherit;\">Host \/ Name<\/th>\n        <th style=\"background:#1F3A5C;color:#ffffff;text-align:left;font-weight:700;font-size:14px;letter-spacing:.2px;padding:16px 18px;font-family:inherit;\">Type<\/th>\n        <th style=\"background:#1F3A5C;color:#ffffff;text-align:left;font-weight:700;font-size:14px;letter-spacing:.2px;padding:16px 18px;font-family:inherit;\">Value<\/th>\n        <th style=\"background:#1F3A5C;color:#ffffff;text-align:left;font-weight:700;font-size:14px;letter-spacing:.2px;padding:16px 18px;font-family:inherit;\">What each part does<\/th>\n      <\/tr>\n    <\/thead>\n    <tbody>\n      <tr style=\"background:#FFFFFF;\">\n        <td style=\"padding:14px 18px;vertical-align:top;font-size:15px;line-height:1.5;color:#24262B;border-bottom:1px solid #EAECEF;font-family:inherit;\"><strong style=\"color:#1F3A5C;\">SPF<\/strong><\/td>\n        <td style=\"padding:14px 18px;vertical-align:top;font-size:13px;line-height:1.5;color:#24262B;border-bottom:1px solid #EAECEF;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;word-break:break-word;\">example.com<\/td>\n        <td style=\"padding:14px 18px;vertical-align:top;font-size:12px;font-weight:700;letter-spacing:.5px;color:#1F3A5C;border-bottom:1px solid #EAECEF;font-family:inherit;\">TXT<\/td>\n        <td style=\"padding:14px 18px;vertical-align:top;border-bottom:1px solid #EAECEF;\"><code style=\"display:inline-block;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12.5px;line-height:1.5;background:#F3F4F6;color:#24262B;padding:6px 8px;border-radius:5px;word-break:break-word;\">v=spf1 include:_spf.google.com include:spf.mailercloud.com ip4:203.0.113.14 -all<\/code><\/td>\n        <td style=\"padding:14px 18px;vertical-align:top;font-size:14px;line-height:1.55;color:#24262B;border-bottom:1px solid #EAECEF;font-family:inherit;\"><code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12.5px;color:#1F3A5C;\">v=spf1<\/code> version, mandatory first. <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12.5px;color:#1F3A5C;\">include:<\/code> a provider&#8217;s authorized IPs (1 lookup each). <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12.5px;color:#1F3A5C;\">ip4:<\/code> IP literal (0 lookups). <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12.5px;color:#1F3A5C;\">-all<\/code> hard-fails everything else.<\/td>\n      <\/tr>\n      <tr style=\"background:#F5F6F7;\">\n        <td style=\"padding:14px 18px;vertical-align:top;font-size:15px;line-height:1.5;color:#24262B;border-bottom:1px solid #EAECEF;font-family:inherit;\"><strong style=\"color:#1F3A5C;\">DKIM<\/strong><\/td>\n        <td style=\"padding:14px 18px;vertical-align:top;font-size:13px;line-height:1.5;color:#24262B;border-bottom:1px solid #EAECEF;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;word-break:break-word;\">mc2026._domainkey.example.com<\/td>\n        <td style=\"padding:14px 18px;vertical-align:top;font-size:12px;font-weight:700;letter-spacing:.5px;color:#1F3A5C;border-bottom:1px solid #EAECEF;font-family:inherit;\">TXT<\/td>\n        <td style=\"padding:14px 18px;vertical-align:top;border-bottom:1px solid #EAECEF;\"><code style=\"display:inline-block;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12.5px;line-height:1.5;background:#F3F4F6;color:#24262B;padding:6px 8px;border-radius:5px;word-break:break-word;\">v=DKIM1; k=rsa; t=s; p=MIIBIjANBgkqh...IDAQAB<\/code><\/td>\n        <td style=\"padding:14px 18px;vertical-align:top;font-size:14px;line-height:1.55;color:#24262B;border-bottom:1px solid #EAECEF;font-family:inherit;\"><code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12.5px;color:#1F3A5C;\">mc2026<\/code> is your chosen selector. <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12.5px;color:#1F3A5C;\">k=<\/code> key type. <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12.5px;color:#1F3A5C;\">p=<\/code> base64 public key. <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12.5px;color:#1F3A5C;\">t=s<\/code> optional strict-subdomain flag; omit if subdomains sign with this key.<\/td>\n      <\/tr>\n      <tr style=\"background:#FFFFFF;\">\n        <td style=\"padding:14px 18px;vertical-align:top;font-size:15px;line-height:1.5;color:#24262B;border-bottom:1px solid #EAECEF;font-family:inherit;\"><strong style=\"color:#1F3A5C;\">DKIM (delegated)<\/strong><\/td>\n        <td style=\"padding:14px 18px;vertical-align:top;font-size:13px;line-height:1.5;color:#24262B;border-bottom:1px solid #EAECEF;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;word-break:break-word;\">mc2026._domainkey.example.com<\/td>\n        <td style=\"padding:14px 18px;vertical-align:top;font-size:12px;font-weight:700;letter-spacing:.5px;color:#1E9E57;border-bottom:1px solid #EAECEF;font-family:inherit;\">CNAME<\/td>\n        <td style=\"padding:14px 18px;vertical-align:top;border-bottom:1px solid #EAECEF;\"><code style=\"display:inline-block;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12.5px;line-height:1.5;background:#F3F4F6;color:#24262B;padding:6px 8px;border-radius:5px;word-break:break-word;\">mc2026.dkim.mailercloud.com<\/code><\/td>\n        <td style=\"padding:14px 18px;vertical-align:top;font-size:14px;line-height:1.55;color:#24262B;border-bottom:1px solid #EAECEF;font-family:inherit;\">Provider hosts and rotates the key. <strong style=\"color:#1E9E57;\">Preferred where supported<\/strong> \u2014 no string splitting, no manual rotation.<\/td>\n      <\/tr>\n      <tr style=\"background:#F5F6F7;\">\n        <td style=\"padding:14px 18px;vertical-align:top;font-size:15px;line-height:1.5;color:#24262B;border-bottom:1px solid #EAECEF;font-family:inherit;\"><strong style=\"color:#1F3A5C;\">DMARC<\/strong><\/td>\n        <td style=\"padding:14px 18px;vertical-align:top;font-size:13px;line-height:1.5;color:#24262B;border-bottom:1px solid #EAECEF;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;word-break:break-word;\">_dmarc.example.com<\/td>\n        <td style=\"padding:14px 18px;vertical-align:top;font-size:12px;font-weight:700;letter-spacing:.5px;color:#1F3A5C;border-bottom:1px solid #EAECEF;font-family:inherit;\">TXT<\/td>\n        <td style=\"padding:14px 18px;vertical-align:top;border-bottom:1px solid #EAECEF;\"><code style=\"display:inline-block;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12.5px;line-height:1.5;background:#F3F4F6;color:#24262B;padding:6px 8px;border-radius:5px;word-break:break-word;\">v=DMARC1; p=none; rua=mailto:dmarc@example.com; ruf=mailto:forensic@example.com; fo=1; adkim=r; aspf=r; sp=none; np=none<\/code><\/td>\n        <td style=\"padding:14px 18px;vertical-align:top;font-size:14px;line-height:1.55;color:#24262B;border-bottom:1px solid #EAECEF;font-family:inherit;\"><code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12.5px;color:#1F3A5C;\">p=<\/code> policy. <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12.5px;color:#1F3A5C;\">rua=<\/code> aggregate reports. <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12.5px;color:#1F3A5C;\">ruf=<\/code> failure reports. <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12.5px;color:#1F3A5C;\">fo=1<\/code> report on any single failure. <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12.5px;color:#1F3A5C;\">np=<\/code> policy for non-existent subdomains (RFC 9989). <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12.5px;color:#1F3A5C;\">adkim\/aspf<\/code> alignment mode. <code style=\"font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12.5px;color:#1F3A5C;\">sp=<\/code> subdomain policy.<\/td>\n      <\/tr>\n      <tr style=\"background:#FFFFFF;\">\n        <td style=\"padding:14px 18px;vertical-align:top;font-size:15px;line-height:1.5;color:#24262B;font-family:inherit;\"><strong style=\"color:#1F3A5C;\">Bounce domain<\/strong><\/td>\n        <td style=\"padding:14px 18px;vertical-align:top;font-size:13px;line-height:1.5;color:#24262B;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;word-break:break-word;\">bounce.example.com<\/td>\n        <td style=\"padding:14px 18px;vertical-align:top;font-size:12px;font-weight:700;letter-spacing:.5px;color:#1E9E57;font-family:inherit;\">CNAME<\/td>\n        <td style=\"padding:14px 18px;vertical-align:top;\"><code style=\"display:inline-block;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12.5px;line-height:1.5;background:#F3F4F6;color:#24262B;padding:6px 8px;border-radius:5px;word-break:break-word;\">bounce.mailercloud.com<\/code><\/td>\n        <td style=\"padding:14px 18px;vertical-align:top;font-size:14px;line-height:1.55;color:#24262B;font-family:inherit;\">Puts the envelope sender inside your own organizational domain, so SPF aligns under relaxed mode.<\/td>\n      <\/tr>\n    <\/tbody>\n  <\/table>\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"SPF_Implementation\"><\/span>SPF: Implementation<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">An SPF record is a single TXT record at your root domain, and <strong>you may publish exactly one.<\/strong> Two <code>v=spf1<\/code> records on the same name is a PermError, which DMARC treats as SPF failing. When you add a sending platform, merge its <code>include:<\/code> into the existing record \u2014 never publish a second one.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">The 10-lookup limit<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/www.rfc-editor.org\/rfc\/rfc7208\" rel=\"nofollow\">RFC 7208 \u00a74.6.4<\/a> caps SPF evaluation at <strong>10 DNS-querying terms<\/strong> per check \u2014 mechanisms plus the <code>redirect<\/code> modifier. Exceed it and the result is PermError, not a soft degradation. What counts: <code>include<\/code>, <code>a<\/code>, <code>mx<\/code>, <code>ptr<\/code>, <code>exists<\/code> and the <code>redirect<\/code> modifier \u2014 recursively, so an <code>include<\/code> that itself contains three includes costs you four. Free: <code>ip4<\/code>, <code>ip6<\/code>, <code>all<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Blowing the limit is easy: Google Workspace, a marketing platform, a helpdesk, a CRM and an invoicing tool is five includes on the surface and frequently eleven or more once expanded. Ways to stay under, in order of preference:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Remove what you no longer use.<\/strong> Most over-limit records contain includes for platforms churned off years ago. Audit before you optimize.<\/li>\n\n\n\n<li><strong>Replace includes with <code>ip4:<\/code> literals<\/strong> for providers publishing a small, stable IP set. Zero lookups, but you track changes yourself.<\/li>\n\n\n\n<li><strong>Delegate by subdomain.<\/strong> Marketing from <code>news.example.com<\/code>, transactional from <code>mail.example.com<\/code>, each with its own record and its own budget of 10. The cleanest structural fix, and it isolates reputation too.<\/li>\n\n\n\n<li><strong>SPF flattening<\/strong> \u2014 resolving includes into IP literals automatically. It works, but silently breaks when a provider changes IPs, so only use a service that re-flattens continuously.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">There is a second, less-known limit: RFC 7208 says implementations <strong>SHOULD<\/strong> limit &#8220;void lookups&#8221; \u2014 queries returning NXDOMAIN or a zero-answer NODATA \u2014 <strong>to two<\/strong>. It is a recommendation, not a MUST, and receivers configure it differently, so a record can PermError at one provider and pass at another. An <code>include:<\/code> pointing at a decommissioned vendor can PermError your record while you are still well under 10 lookups.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">include vs redirect, and ~all vs -all<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Use <code>include:<\/code> in almost every case. It adds another record&#8217;s mechanisms and continues to your own <code>all<\/code> if there is no match. <code>redirect=<\/code> hands evaluation over entirely \u2014 your <code>all<\/code> is ignored and the target&#8217;s policy becomes yours. Reserve it for many domains sharing one managed record.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>-all<\/code> (hard fail) tells receivers to treat unlisted sources as unauthorized; <code>~all<\/code> (soft fail) says &#8220;probably unauthorized, accept but note it.&#8221; Neither changes DMARC&#8217;s arithmetic \u2014 softfail and fail both count as SPF not passing \u2014 but <code>-all<\/code> gives non-DMARC receivers a clear signal. Start on <code>~all<\/code> while you are still discovering senders, move to <code>-all<\/code> once the inventory is complete. Never use <code>?all<\/code> or <code>+all<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Two failure modes account for most SPF trouble. <strong>Forwarding<\/strong> breaks SPF by design \u2014 a mailing list relays from an IP not in your record \u2014 which is exactly why DKIM survival matters. And <strong>SPF published for the wrong domain<\/strong>: your ESP sends with an envelope of <code>bounces.esp.net<\/code>, so your record is never consulted.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"DKIM_Implementation\"><\/span>DKIM: Implementation<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Key generation and size<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Generate a 2048-bit RSA key pair. 1024-bit is the <a href=\"https:\/\/www.rfc-editor.org\/rfc\/rfc8301\" rel=\"nofollow\">RFC 8301<\/a> minimum and Google still accepts it (&#8220;requires a DKIM key of 1024 bits or longer&#8221;), but Google recommends 2048 (&#8220;we recommend using a 2048-bit key if your domain provider supports this&#8221;). 4096-bit keys are inside the range every conformant verifier MUST validate (RFC 8301 \u00a73.2: &#8220;Verifiers MUST be able to validate signatures with keys ranging from 1024 bits to 4096 bits&#8221;); the reason to think twice is DNS publishing friction \u2014 more quoted strings, and possible truncation on resolvers without EDNS0 \u2014 not verifier support. Self-signing is two commands:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>openssl genrsa -out mc2026.private 2048<\/code><\/li>\n\n\n\n<li><code>openssl rsa -in mc2026.private -pubout -outform PEM -out mc2026.public<\/code><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Strip the PEM header, footer and newlines from the public key and put the remaining base64 in the <code>p=<\/code> tag. A 2048-bit public key runs around 392 characters, over the 255-byte single-string DNS limit, so it must be published as multiple quoted strings inside one TXT record. Most DNS providers handle this automatically; a key that publishes cleanly but fails verification is usually a splitting problem.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Selector naming<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The selector is the label in <code>selector._domainkey.example.com<\/code>, and it exists so one domain can hold many keys at once. Name it for purpose and vintage \u2014 <code>mc2026<\/code>, <code>txn-2026q3<\/code>, <code>gsuite<\/code> \u2014 and avoid <code>default<\/code>, <code>s1<\/code> and <code>k1<\/code>, which collide across providers and tell you nothing a year later.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Key rotation<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Rotate at least annually, and immediately if a private key may have been exposed. The safe sequence never edits an in-use record:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Generate a new pair under a <strong>new selector<\/strong> and publish its public key. Both selectors are now live.<\/li>\n\n\n\n<li>Wait for propagation \u2014 at least the old record&#8217;s TTL, in practice 24\u201348 hours.<\/li>\n\n\n\n<li>Switch signing to the new selector.<\/li>\n\n\n\n<li>Leave the old selector published a further 7\u201314 days so mail in forwarder queues still verifies, then remove it and destroy the old private key.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">If your ESP supports CNAME-delegated DKIM, use it \u2014 rotation becomes the provider&#8217;s problem and these steps disappear.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Third-party signing<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Every platform that sends on your behalf \u2014 ESP, CRM, helpdesk, billing system \u2014 needs its own selector under your domain. The test that matters is not &#8220;does DKIM pass&#8221; but &#8220;does the signature&#8217;s <code>d=<\/code> equal my organizational domain.&#8221; A vendor signing as <code>d=vendor.com<\/code> gives you a passing DKIM check that contributes nothing to DMARC.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"DMARC_Implementation\"><\/span>DMARC: Implementation<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Publish one TXT record at <code>_dmarc.example.com<\/code>. The tags you will actually use:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>v=DMARC1<\/code> mandatory and first; <code>p=<\/code> (<code>none<\/code>, <code>quarantine<\/code>, <code>reject<\/code>) mandatory and second.<\/li>\n\n\n\n<li><code>rua=mailto:<\/code> \u2014 aggregate XML reports. The tag that makes DMARC useful; never omit it.<\/li>\n\n\n\n<li><code>ruf=mailto:<\/code> \u2014 per-message failure reports. They contain recipient data, so many receivers do not send them at all. Optional.<\/li>\n\n\n\n<li><code>t=<\/code> \u2014 test mode (RFC 9989), replacing the removed <code>pct=<\/code> tag. <code>t=y<\/code> reports under the declared policy without enforcing it; <code>t=n<\/code> is the default.<\/li>\n\n\n\n<li><code>np=<\/code> \u2014 policy for non-existent subdomains (RFC 9989). Falls back to <code>sp=<\/code>, then <code>p=<\/code>, if absent.<\/li>\n\n\n\n<li><code>sp=<\/code> \u2014 subdomain policy. If absent, subdomains inherit <code>p=<\/code>.<\/li>\n\n\n\n<li><code>adkim=<\/code> \/ <code>aspf=<\/code> \u2014 <code>r<\/code> relaxed (default) or <code>s<\/code> strict. <code>fo=1<\/code> reports on any single failure; use it.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Staged rollout timeline<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Moving straight to <code>p=reject<\/code> is how organizations discover, at scale and in public, that their invoicing system was never DKIM-signed. Ramp instead. The timeline below suits a handful of sending platforms; an enterprise with dozens should expect longer in phases 2 and 3, not to skip them.<\/p>\n\n\n\n<!--\n  TABLE 2 \u2014 Staged DMARC rollout timeline (SPF\/DKIM\/DMARC implementation post)\n  Paste into a WordPress \"Custom HTML\" block. All styles inline; no theme CSS needed.\n  Navy header #1F3A5C \u00b7 striped rows #F5F6F7\/#FFFFFF \u00b7 green phase numbers & gates \u00b7 DMARC records in monospace chips\n  NOTE: the phase-5 \"mail still flows\" wording reflects your draft; under RFC 9989, p=reject; t=y is treated\n  as quarantine (mail is held, not delivered) \u2014 consider softening that cell before publishing.\n-->\n<div style=\"overflow-x:auto;border:1px solid #EAECEF;border-radius:8px;margin:24px 0;\">\n  <table style=\"width:100%;border-collapse:collapse;min-width:880px;font-family:inherit;\">\n    <thead>\n      <tr>\n        <th style=\"background:#1F3A5C;color:#ffffff;text-align:left;font-weight:700;font-size:14px;letter-spacing:.2px;padding:16px 18px;font-family:inherit;\">Phase<\/th>\n        <th style=\"background:#1F3A5C;color:#ffffff;text-align:left;font-weight:700;font-size:14px;letter-spacing:.2px;padding:16px 18px;font-family:inherit;\">Typical duration<\/th>\n        <th style=\"background:#1F3A5C;color:#ffffff;text-align:left;font-weight:700;font-size:14px;letter-spacing:.2px;padding:16px 18px;font-family:inherit;\">Record<\/th>\n        <th style=\"background:#1F3A5C;color:#ffffff;text-align:left;font-weight:700;font-size:14px;letter-spacing:.2px;padding:16px 18px;font-family:inherit;\">What you are doing<\/th>\n        <th style=\"background:#1F3A5C;color:#ffffff;text-align:left;font-weight:700;font-size:14px;letter-spacing:.2px;padding:16px 18px;font-family:inherit;\">Gate to advance<\/th>\n      <\/tr>\n    <\/thead>\n    <tbody>\n      <tr style=\"background:#FFFFFF;\">\n        <td style=\"padding:14px 18px;vertical-align:top;font-size:15px;line-height:1.5;color:#24262B;border-bottom:1px solid #EAECEF;font-family:inherit;\"><strong style=\"color:#1E9E57;\">1.<\/strong> <strong style=\"color:#1F3A5C;\">Monitor<\/strong><\/td>\n        <td style=\"padding:14px 18px;vertical-align:top;font-size:15px;line-height:1.5;color:#24262B;border-bottom:1px solid #EAECEF;font-family:inherit;\">2\u20134 weeks<\/td>\n        <td style=\"padding:14px 18px;vertical-align:top;border-bottom:1px solid #EAECEF;\"><code style=\"display:inline-block;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12.5px;line-height:1.5;background:#F3F4F6;color:#24262B;padding:6px 8px;border-radius:5px;word-break:break-word;\">v=DMARC1; p=none; rua=mailto:dmarc@example.com; fo=1;<\/code><\/td>\n        <td style=\"padding:14px 18px;vertical-align:top;font-size:14px;line-height:1.55;color:#24262B;border-bottom:1px solid #EAECEF;font-family:inherit;\">Inventorying everything that sends as your domain.<\/td>\n        <td style=\"padding:14px 18px;vertical-align:top;font-size:14px;line-height:1.55;color:#24262B;border-bottom:1px solid #EAECEF;font-family:inherit;\">You recognize every source in the reports.<\/td>\n      <\/tr>\n      <tr style=\"background:#F5F6F7;\">\n        <td style=\"padding:14px 18px;vertical-align:top;font-size:15px;line-height:1.5;color:#24262B;border-bottom:1px solid #EAECEF;font-family:inherit;\"><strong style=\"color:#1E9E57;\">2.<\/strong> <strong style=\"color:#1F3A5C;\">Remediate<\/strong><\/td>\n        <td style=\"padding:14px 18px;vertical-align:top;font-size:15px;line-height:1.5;color:#24262B;border-bottom:1px solid #EAECEF;font-family:inherit;\">4\u20138 weeks<\/td>\n        <td style=\"padding:14px 18px;vertical-align:top;font-size:14px;line-height:1.5;color:#6B7280;font-style:italic;border-bottom:1px solid #EAECEF;font-family:inherit;\">unchanged<\/td>\n        <td style=\"padding:14px 18px;vertical-align:top;font-size:14px;line-height:1.55;color:#24262B;border-bottom:1px solid #EAECEF;font-family:inherit;\">Fixing alignment per source: custom bounce domains, DKIM keys signing as your domain.<\/td>\n        <td style=\"padding:14px 18px;vertical-align:top;font-size:14px;line-height:1.55;color:#24262B;border-bottom:1px solid #EAECEF;font-family:inherit;\">&gt;95% of legitimate volume aligned for 2 weeks.<\/td>\n      <\/tr>\n      <tr style=\"background:#FFFFFF;\">\n        <td style=\"padding:14px 18px;vertical-align:top;font-size:15px;line-height:1.5;color:#24262B;border-bottom:1px solid #EAECEF;font-family:inherit;\"><strong style=\"color:#1E9E57;\">3.<\/strong> <strong style=\"color:#1F3A5C;\">Quarantine, test mode<\/strong><\/td>\n        <td style=\"padding:14px 18px;vertical-align:top;font-size:15px;line-height:1.5;color:#24262B;border-bottom:1px solid #EAECEF;font-family:inherit;\">2\u20134 weeks<\/td>\n        <td style=\"padding:14px 18px;vertical-align:top;border-bottom:1px solid #EAECEF;\"><code style=\"display:inline-block;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12.5px;line-height:1.5;background:#F3F4F6;color:#24262B;padding:6px 8px;border-radius:5px;word-break:break-word;\">p=quarantine; t=y;<\/code><\/td>\n        <td style=\"padding:14px 18px;vertical-align:top;font-size:14px;line-height:1.55;color:#24262B;border-bottom:1px solid #EAECEF;font-family:inherit;\">Receivers report against the quarantine policy without applying it.<\/td>\n        <td style=\"padding:14px 18px;vertical-align:top;font-size:14px;line-height:1.55;color:#24262B;border-bottom:1px solid #EAECEF;font-family:inherit;\">No new legitimate failures in two weeks of reports.<\/td>\n      <\/tr>\n      <tr style=\"background:#F5F6F7;\">\n        <td style=\"padding:14px 18px;vertical-align:top;font-size:15px;line-height:1.5;color:#24262B;border-bottom:1px solid #EAECEF;font-family:inherit;\"><strong style=\"color:#1E9E57;\">4.<\/strong> <strong style=\"color:#1F3A5C;\">Quarantine, enforced<\/strong><\/td>\n        <td style=\"padding:14px 18px;vertical-align:top;font-size:15px;line-height:1.5;color:#24262B;border-bottom:1px solid #EAECEF;font-family:inherit;\">2\u20134 weeks<\/td>\n        <td style=\"padding:14px 18px;vertical-align:top;border-bottom:1px solid #EAECEF;\"><code style=\"display:inline-block;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12.5px;line-height:1.5;background:#F3F4F6;color:#24262B;padding:6px 8px;border-radius:5px;word-break:break-word;\">p=quarantine; t=n;<\/code><\/td>\n        <td style=\"padding:14px 18px;vertical-align:top;font-size:14px;line-height:1.55;color:#24262B;border-bottom:1px solid #EAECEF;font-family:inherit;\">All failing mail quarantined. Last stage where a mistake is recoverable from the spam folder.<\/td>\n        <td style=\"padding:14px 18px;vertical-align:top;font-size:14px;line-height:1.55;color:#24262B;border-bottom:1px solid #EAECEF;font-family:inherit;\">Two clean weeks of reports.<\/td>\n      <\/tr>\n      <tr style=\"background:#FFFFFF;\">\n        <td style=\"padding:14px 18px;vertical-align:top;font-size:15px;line-height:1.5;color:#24262B;border-bottom:1px solid #EAECEF;font-family:inherit;\"><strong style=\"color:#1E9E57;\">5.<\/strong> <strong style=\"color:#1F3A5C;\">Reject, test mode<\/strong><\/td>\n        <td style=\"padding:14px 18px;vertical-align:top;font-size:15px;line-height:1.5;color:#24262B;border-bottom:1px solid #EAECEF;font-family:inherit;\">2\u20134 weeks<\/td>\n        <td style=\"padding:14px 18px;vertical-align:top;border-bottom:1px solid #EAECEF;\"><code style=\"display:inline-block;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12.5px;line-height:1.5;background:#F3F4F6;color:#24262B;padding:6px 8px;border-radius:5px;word-break:break-word;\">p=reject; t=y;<\/code><\/td>\n        <td style=\"padding:14px 18px;vertical-align:top;font-size:14px;line-height:1.55;color:#24262B;border-bottom:1px solid #EAECEF;font-family:inherit;\">Reports reflect the reject policy while mail still flows. Your last look before bounces are real.<\/td>\n        <td style=\"padding:14px 18px;vertical-align:top;font-size:14px;line-height:1.55;color:#24262B;border-bottom:1px solid #EAECEF;font-family:inherit;\">No legitimate mail would have been rejected.<\/td>\n      <\/tr>\n      <tr style=\"background:#F5F6F7;\">\n        <td style=\"padding:14px 18px;vertical-align:top;font-size:15px;line-height:1.5;color:#24262B;font-family:inherit;\"><strong style=\"color:#1E9E57;\">6.<\/strong> <strong style=\"color:#1F3A5C;\">Reject, enforced<\/strong><\/td>\n        <td style=\"padding:14px 18px;vertical-align:top;font-size:15px;line-height:1.5;color:#1E9E57;font-weight:700;font-family:inherit;\">ongoing<\/td>\n        <td style=\"padding:14px 18px;vertical-align:top;\"><code style=\"display:inline-block;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12.5px;line-height:1.5;background:#F3F4F6;color:#24262B;padding:6px 8px;border-radius:5px;word-break:break-word;\">p=reject; t=n; sp=reject; np=reject;<\/code><\/td>\n        <td style=\"padding:14px 18px;vertical-align:top;font-size:14px;line-height:1.55;color:#24262B;font-family:inherit;\">Enforcement. Keep reading reports \u2014 new SaaS tools appear constantly.<\/td>\n        <td style=\"padding:14px 18px;vertical-align:top;font-size:14px;line-height:1.55;color:#6B7280;font-family:inherit;\">\u2014<\/td>\n      <\/tr>\n    <\/tbody>\n  <\/table>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><strong><a href=\"https:\/\/www.rfc-editor.org\/rfc\/rfc9989\" rel=\"nofollow\">RFC 9989<\/a> (May 2026) removed the <code>pct=<\/code> tag.<\/strong> DMARC&#8217;s staged-rollout dial is now the binary <code>t=<\/code> test-mode tag: <code>t=y<\/code> tells receivers to report under the declared policy without enforcing it, <code>t=n<\/code> (default) enforces. Records still carrying <code>pct=<\/code> are not rejected \u2014 the tag is simply ignored \u2014 but it no longer buys you a partial rollout, so plan phases around remediation completeness rather than a percentage.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Subdomain policy<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Set <code>sp=<\/code> explicitly. Attackers routinely forge subdomains never used for mail \u2014 <code>billing.example.com<\/code>, <code>secure.example.com<\/code> \u2014 precisely because they are usually unprotected. If subdomains are not yet in remediation scope, publish <code>sp=none<\/code> deliberately while the parent ramps, then tighten. For any subdomain that will never send, publish <code>v=spf1 -all<\/code>. Since RFC 9989 you no longer need a per-subdomain <code>_dmarc<\/code> record for non-existent names: a single <code>np=reject<\/code> on the organizational domain covers every subdomain that does not exist in DNS.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"How_to_Validate_Your_Setup\"><\/span>How to Validate Your Setup<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Check DNS directly rather than trusting a dashboard.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>SPF:<\/strong> <code>dig +short TXT example.com | grep spf1<\/code><\/li>\n\n\n\n<li><strong>DKIM:<\/strong> <code>dig +short TXT mc2026._domainkey.example.com<\/code><\/li>\n\n\n\n<li><strong>DMARC:<\/strong> <code>dig +short TXT _dmarc.example.com<\/code><\/li>\n\n\n\n<li><strong>Reverse DNS on your sending IP:<\/strong> <code>dig +short -x 203.0.113.14<\/code> \u2014 then confirm the hostname resolves back to the same IP. That round trip is FCrDNS, and all three providers require it.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Then validate end-to-end on a real message \u2014 the only test that catches alignment problems. Send to a seed address at Gmail, Outlook.com and Yahoo. In Gmail, open the message and choose <strong>Show original<\/strong>: the domain shown beside SPF, DKIM and DMARC must be <em>your<\/em> domain, not your ESP&#8217;s. In the raw headers, check <code>Authentication-Results:<\/code> for <code>dmarc=pass<\/code> and the <code>header.from=<\/code> value, then confirm that the <code>DKIM-Signature<\/code> <code>d=<\/code> tag or the <code>Return-Path<\/code> \u2014 at least one \u2014 sits inside your organizational domain.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For a step-by-step verification trace, send a message to a mailbox at <strong>learndmarc.com<\/strong> or <strong>appmaildev.com<\/strong>. Track ongoing spam rate and authentication pass rates against the 0.30% ceiling in <strong><a href=\"https:\/\/support.google.com\/mail\/answer\/9981691\" rel=\"nofollow\">Google Postmaster Tools<\/a><\/strong>; Microsoft&#8217;s equivalent is <strong>SNDS<\/strong>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Reading_DMARC_Reports_Without_Drowning\"><\/span>Reading DMARC Reports Without Drowning<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Aggregate reports arrive as gzipped XML, one per receiver per day, and a mid-sized domain gets dozens daily. Route <code>rua=<\/code> to a dedicated mailbox and put a parser in front of it \u2014 dmarcian, Postmark&#8217;s free DMARC Digests, Valimail Monitor and URIports all produce source-level summaries. Once parsed, look at four things and ignore the rest:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Unaligned volume from sources you recognize.<\/strong> Your remediation backlog, and the only thing blocking enforcement. A CRM sending 4,000 unaligned messages a week is a configuration ticket, not an attack.<\/li>\n\n\n\n<li><strong>Volume from sources you do not recognize.<\/strong> Usually a department that signed up for a tool without telling anyone. Genuine spoofing tends to be low-volume, geographically scattered, with both SPF and DKIM failing.<\/li>\n\n\n\n<li><strong>Forwarding signatures.<\/strong> SPF fails, DKIM passes and aligns, DMARC passes \u2014 this is DKIM doing its job. SPF-fail plus DKIM-fail from a mailing-list IP range means the list is modifying the body and breaking the signature. Both are normal, and neither is a reason to stay off enforcement.<\/li>\n\n\n\n<li><strong>The aligned percentage trend.<\/strong> One number, tracked weekly, gating every phase transition above.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Reports lag by roughly 24 hours and contain no message content \u2014 they tell you what authenticated, not what was sent.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Common_Implementation_Mistakes_Ranked\"><\/span>Common Implementation Mistakes, Ranked<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>SPF and DKIM pass, but neither aligns.<\/strong> The default failure. The fix is a custom bounce domain, a DKIM key signing as your domain, or both \u2014 not more SPF includes. If you are working back from a bounce, start by confirming <a href=\"https:\/\/www.mailercloud.com\/blog\/smtp-5-7-x-bounce-codes-explained\">which 5.7.x code you actually received<\/a>.<\/li>\n\n\n\n<li><strong>Two SPF records on one domain.<\/strong> Instant PermError, usually created the day a second platform is onboarded.<\/li>\n\n\n\n<li><strong>Exceeding 10 DNS lookups.<\/strong> Silent until it isn&#8217;t. Re-check after every vendor addition.<\/li>\n\n\n\n<li><strong>Jumping to <code>p=reject<\/code> without a monitoring phase.<\/strong> Guarantees some low-volume, business-critical system \u2014 payroll, dunning notices, password resets \u2014 starts bouncing before anyone notices.<\/li>\n\n\n\n<li><strong>Publishing DMARC with no <code>rua=<\/code>.<\/strong> Technically compliant, operationally useless: enforcement with no visibility.<\/li>\n\n\n\n<li><strong>Forgetting <code>sp=<\/code><\/strong>, leaving subdomains as the easy path for spoofing; and <strong>rotating DKIM by overwriting a live selector<\/strong>, which breaks verification for every message in flight.<\/li>\n\n\n\n<li><strong>Assuming authentication fixes deliverability.<\/strong> It is the entry requirement, not the outcome. Authenticated mail with a 0.4% complaint rate still lands in spam, just with an unambiguous identity attached. At Microsoft in particular, <a href=\"https:\/\/www.mailercloud.com\/blog\/emails-going-to-spam-only-outlook\">authenticated mail can still land in spam<\/a>.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"How_Mailercloud_Handles_Authentication\"><\/span>How Mailercloud Handles Authentication<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">At Mailercloud we deliver over a billion emails a month, so authentication is set up once and then monitored rather than left to drift. Sending domains are provisioned with CNAME-delegated DKIM, so keys rotate on our side without you touching DNS, and with a custom bounce subdomain so SPF aligns to your organizational domain from the first send. Our deliverability team flags unaligned streams before they meet an enforcement policy.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If you are mid-rollout and want a second pair of eyes on your records, <a href=\"https:\/\/www.mailercloud.com\/contact\">talk to our deliverability team<\/a> \u2014 or <a href=\"https:\/\/app.mailercloud.com\/register\">start free with Mailercloud<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"FAQ_SPF_DKIM_and_DMARC_Implementation\"><\/span>FAQ: SPF, DKIM and DMARC Implementation<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Do I need both SPF and DKIM, or is one enough?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Gmail, Yahoo and Microsoft all require both configured and passing for bulk senders. DMARC itself only needs one <em>aligned<\/em>, but that is a different question from whether both must exist. Configure both \u2014 DKIM matters more in practice because it survives forwarding.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">How long after publishing DNS records will authentication start working?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Propagation follows the TTL on the records, typically 1\u201324 hours. Set a low TTL (300 seconds) before making changes and raise it once stable. Aggregate reports start arriving roughly 24\u201348 hours after you publish <code>rua=<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Is <code>p=none<\/code> good enough to stay compliant?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">For the published bulk-sender requirements at Google, Yahoo and Microsoft, yes. But it provides no anti-spoofing protection, and receivers have signaled that expectations are moving toward quarantine and reject. Treat <code>p=none<\/code> as a starting position with a timeline attached, not a destination.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">What breaks when I turn on <code>p=reject<\/code>?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Anything sending as your domain without aligned authentication: forgotten SaaS tools, on-premise scanners and monitoring systems that mail out directly, and any vendor still signing with its own <code>d=<\/code> domain. Mailing lists that modify subject lines or append footers break DKIM and, if SPF is also unaligned, will fail. A full monitoring phase surfaces all of these before enforcement does.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Should I use one DKIM key for everything or one per platform?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">One selector per platform. It costs nothing \u2014 a domain can publish as many selectors as it needs \u2014 and it lets you revoke a compromised or churned vendor&#8217;s key by deleting a single DNS record, without interrupting any other mail stream.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>A hands-on reference for how to set up SPF, DKIM and DMARC \u2014 record syntax, the 10-lookup limit, key rotation, staged p=reject rollout, and dig commands.<\/p>\n","protected":false},"author":19,"featured_media":5346,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[28],"tags":[45,52,53,54,50,51],"class_list":["post-5207","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-email-delivery","tag-deliverability","tag-dkim","tag-dmarc","tag-dns","tag-email-authentication","tag-spf"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>How to Set Up SPF, DKIM &amp; DMARC: 2026 Implementation Guide<\/title>\n<meta name=\"description\" content=\"Set up SPF, DKIM and DMARC the right way: copy-paste DNS records, the 10-lookup fix, DMARC alignment, and a staged rollout to p=reject.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.mailercloud.com\/blog\/spf-dkim-dmarc-implementation-guide\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"How to Set Up SPF, DKIM &amp; DMARC: 2026 Implementation Guide\" \/>\n<meta property=\"og:description\" content=\"Set up SPF, DKIM and DMARC the right way: copy-paste DNS records, the 10-lookup fix, DMARC alignment, and a staged rollout to p=reject.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.mailercloud.com\/blog\/spf-dkim-dmarc-implementation-guide\" \/>\n<meta property=\"og:site_name\" content=\"Mailercloud Blog\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/mailercloud\" \/>\n<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/cherikkapoyil.amar\" \/>\n<meta property=\"article:published_time\" content=\"2026-08-06T12:24:04+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-08-06T12:24:06+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.mailercloud.com\/blog\/wp-content\/uploads\/2026\/07\/How-to-Set-Up-SPF-DKIM-DMARC_-Implementation-Guide.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"760\" \/>\n\t<meta property=\"og:image:height\" content=\"380\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Amar\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@mailercloud\" \/>\n<meta name=\"twitter:site\" content=\"@mailercloud\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Amar\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"13 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.mailercloud.com\\\/blog\\\/spf-dkim-dmarc-implementation-guide#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.mailercloud.com\\\/blog\\\/spf-dkim-dmarc-implementation-guide\"},\"author\":{\"name\":\"Amar\",\"@id\":\"https:\\\/\\\/www.mailercloud.com\\\/blog\\\/#\\\/schema\\\/person\\\/0f3151b32a261b5f5df0a7968fa64945\"},\"headline\":\"How to Set Up SPF, DKIM &#038; DMARC: Implementation Guide\",\"datePublished\":\"2026-08-06T12:24:04+00:00\",\"dateModified\":\"2026-08-06T12:24:06+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.mailercloud.com\\\/blog\\\/spf-dkim-dmarc-implementation-guide\"},\"wordCount\":2861,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.mailercloud.com\\\/blog\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.mailercloud.com\\\/blog\\\/spf-dkim-dmarc-implementation-guide#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.mailercloud.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/How-to-Set-Up-SPF-DKIM-DMARC_-Implementation-Guide.jpg\",\"keywords\":[\"deliverability\",\"DKIM\",\"DMARC\",\"DNS\",\"email authentication\",\"SPF\"],\"articleSection\":[\"Email Delivery\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.mailercloud.com\\\/blog\\\/spf-dkim-dmarc-implementation-guide#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.mailercloud.com\\\/blog\\\/spf-dkim-dmarc-implementation-guide\",\"url\":\"https:\\\/\\\/www.mailercloud.com\\\/blog\\\/spf-dkim-dmarc-implementation-guide\",\"name\":\"How to Set Up SPF, DKIM & DMARC: 2026 Implementation Guide\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.mailercloud.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.mailercloud.com\\\/blog\\\/spf-dkim-dmarc-implementation-guide#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.mailercloud.com\\\/blog\\\/spf-dkim-dmarc-implementation-guide#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.mailercloud.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/How-to-Set-Up-SPF-DKIM-DMARC_-Implementation-Guide.jpg\",\"datePublished\":\"2026-08-06T12:24:04+00:00\",\"dateModified\":\"2026-08-06T12:24:06+00:00\",\"description\":\"Set up SPF, DKIM and DMARC the right way: copy-paste DNS records, the 10-lookup fix, DMARC alignment, and a staged rollout to p=reject.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.mailercloud.com\\\/blog\\\/spf-dkim-dmarc-implementation-guide#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.mailercloud.com\\\/blog\\\/spf-dkim-dmarc-implementation-guide\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.mailercloud.com\\\/blog\\\/spf-dkim-dmarc-implementation-guide#primaryimage\",\"url\":\"https:\\\/\\\/www.mailercloud.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/How-to-Set-Up-SPF-DKIM-DMARC_-Implementation-Guide.jpg\",\"contentUrl\":\"https:\\\/\\\/www.mailercloud.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/How-to-Set-Up-SPF-DKIM-DMARC_-Implementation-Guide.jpg\",\"width\":760,\"height\":380,\"caption\":\"How to Set Up SPF, DKIM & DMARC: Implementation Guide\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.mailercloud.com\\\/blog\\\/spf-dkim-dmarc-implementation-guide#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.mailercloud.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"How to Set Up SPF, DKIM &#038; DMARC: Implementation Guide\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.mailercloud.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.mailercloud.com\\\/blog\\\/\",\"name\":\"Mailercloud Blog\",\"description\":\"Create And Implement Email Marketing Campaigns\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.mailercloud.com\\\/blog\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.mailercloud.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.mailercloud.com\\\/blog\\\/#organization\",\"name\":\"Mailercloud Blog\",\"url\":\"https:\\\/\\\/www.mailercloud.com\\\/blog\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.mailercloud.com\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.mailercloud.com\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/02\\\/footer_logo.png\",\"contentUrl\":\"https:\\\/\\\/www.mailercloud.com\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/02\\\/footer_logo.png\",\"width\":141,\"height\":30,\"caption\":\"Mailercloud Blog\"},\"image\":{\"@id\":\"https:\\\/\\\/www.mailercloud.com\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/mailercloud\",\"https:\\\/\\\/x.com\\\/mailercloud\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/mailercloud\\\/\",\"https:\\\/\\\/www.instagram.com\\\/mailercloud\\\/\",\"https:\\\/\\\/www.youtube.com\\\/channel\\\/UCslSwv-TECN8rLvFM8wRlog\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.mailercloud.com\\\/blog\\\/#\\\/schema\\\/person\\\/0f3151b32a261b5f5df0a7968fa64945\",\"name\":\"Amar\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.mailercloud.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/04\\\/1547012193070-150x150.jpeg\",\"url\":\"https:\\\/\\\/www.mailercloud.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/04\\\/1547012193070-150x150.jpeg\",\"contentUrl\":\"https:\\\/\\\/www.mailercloud.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/04\\\/1547012193070-150x150.jpeg\",\"caption\":\"Amar\"},\"description\":\"Amar CP is the Co-Founder and Sales Director at Mailercloud, where he leads partnerships, alliances, and customer growth. With over a decade of experience in application development, database architecture, and scaling web systems, Amar brings a rare blend of engineering depth and go-to-market expertise to email marketing. He writes about email deliverability, marketing automation, and helping small businesses grow smarter with data-driven campaigns.\",\"sameAs\":[\"http:\\\/\\\/www.mailercloud.com\",\"https:\\\/\\\/www.facebook.com\\\/cherikkapoyil.amar\",\"https:\\\/\\\/www.instagram.com\\\/amar.cp\\\/\",\"https:\\\/\\\/www.linkedin.com\\\/in\\\/amarcp\\\/\"],\"url\":\"https:\\\/\\\/www.mailercloud.com\\\/blog\\\/author\\\/amarmailercloud-com\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"How to Set Up SPF, DKIM & DMARC: 2026 Implementation Guide","description":"Set up SPF, DKIM and DMARC the right way: copy-paste DNS records, the 10-lookup fix, DMARC alignment, and a staged rollout to p=reject.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.mailercloud.com\/blog\/spf-dkim-dmarc-implementation-guide","og_locale":"en_US","og_type":"article","og_title":"How to Set Up SPF, DKIM & DMARC: 2026 Implementation Guide","og_description":"Set up SPF, DKIM and DMARC the right way: copy-paste DNS records, the 10-lookup fix, DMARC alignment, and a staged rollout to p=reject.","og_url":"https:\/\/www.mailercloud.com\/blog\/spf-dkim-dmarc-implementation-guide","og_site_name":"Mailercloud Blog","article_publisher":"https:\/\/www.facebook.com\/mailercloud","article_author":"https:\/\/www.facebook.com\/cherikkapoyil.amar","article_published_time":"2026-08-06T12:24:04+00:00","article_modified_time":"2026-08-06T12:24:06+00:00","og_image":[{"width":760,"height":380,"url":"https:\/\/www.mailercloud.com\/blog\/wp-content\/uploads\/2026\/07\/How-to-Set-Up-SPF-DKIM-DMARC_-Implementation-Guide.jpg","type":"image\/jpeg"}],"author":"Amar","twitter_card":"summary_large_image","twitter_creator":"@mailercloud","twitter_site":"@mailercloud","twitter_misc":{"Written by":"Amar","Est. reading time":"13 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.mailercloud.com\/blog\/spf-dkim-dmarc-implementation-guide#article","isPartOf":{"@id":"https:\/\/www.mailercloud.com\/blog\/spf-dkim-dmarc-implementation-guide"},"author":{"name":"Amar","@id":"https:\/\/www.mailercloud.com\/blog\/#\/schema\/person\/0f3151b32a261b5f5df0a7968fa64945"},"headline":"How to Set Up SPF, DKIM &#038; DMARC: Implementation Guide","datePublished":"2026-08-06T12:24:04+00:00","dateModified":"2026-08-06T12:24:06+00:00","mainEntityOfPage":{"@id":"https:\/\/www.mailercloud.com\/blog\/spf-dkim-dmarc-implementation-guide"},"wordCount":2861,"commentCount":0,"publisher":{"@id":"https:\/\/www.mailercloud.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.mailercloud.com\/blog\/spf-dkim-dmarc-implementation-guide#primaryimage"},"thumbnailUrl":"https:\/\/www.mailercloud.com\/blog\/wp-content\/uploads\/2026\/07\/How-to-Set-Up-SPF-DKIM-DMARC_-Implementation-Guide.jpg","keywords":["deliverability","DKIM","DMARC","DNS","email authentication","SPF"],"articleSection":["Email Delivery"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.mailercloud.com\/blog\/spf-dkim-dmarc-implementation-guide#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.mailercloud.com\/blog\/spf-dkim-dmarc-implementation-guide","url":"https:\/\/www.mailercloud.com\/blog\/spf-dkim-dmarc-implementation-guide","name":"How to Set Up SPF, DKIM & DMARC: 2026 Implementation Guide","isPartOf":{"@id":"https:\/\/www.mailercloud.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.mailercloud.com\/blog\/spf-dkim-dmarc-implementation-guide#primaryimage"},"image":{"@id":"https:\/\/www.mailercloud.com\/blog\/spf-dkim-dmarc-implementation-guide#primaryimage"},"thumbnailUrl":"https:\/\/www.mailercloud.com\/blog\/wp-content\/uploads\/2026\/07\/How-to-Set-Up-SPF-DKIM-DMARC_-Implementation-Guide.jpg","datePublished":"2026-08-06T12:24:04+00:00","dateModified":"2026-08-06T12:24:06+00:00","description":"Set up SPF, DKIM and DMARC the right way: copy-paste DNS records, the 10-lookup fix, DMARC alignment, and a staged rollout to p=reject.","breadcrumb":{"@id":"https:\/\/www.mailercloud.com\/blog\/spf-dkim-dmarc-implementation-guide#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.mailercloud.com\/blog\/spf-dkim-dmarc-implementation-guide"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.mailercloud.com\/blog\/spf-dkim-dmarc-implementation-guide#primaryimage","url":"https:\/\/www.mailercloud.com\/blog\/wp-content\/uploads\/2026\/07\/How-to-Set-Up-SPF-DKIM-DMARC_-Implementation-Guide.jpg","contentUrl":"https:\/\/www.mailercloud.com\/blog\/wp-content\/uploads\/2026\/07\/How-to-Set-Up-SPF-DKIM-DMARC_-Implementation-Guide.jpg","width":760,"height":380,"caption":"How to Set Up SPF, DKIM & DMARC: Implementation Guide"},{"@type":"BreadcrumbList","@id":"https:\/\/www.mailercloud.com\/blog\/spf-dkim-dmarc-implementation-guide#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.mailercloud.com\/blog\/"},{"@type":"ListItem","position":2,"name":"How to Set Up SPF, DKIM &#038; DMARC: Implementation Guide"}]},{"@type":"WebSite","@id":"https:\/\/www.mailercloud.com\/blog\/#website","url":"https:\/\/www.mailercloud.com\/blog\/","name":"Mailercloud Blog","description":"Create And Implement Email Marketing Campaigns","publisher":{"@id":"https:\/\/www.mailercloud.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.mailercloud.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.mailercloud.com\/blog\/#organization","name":"Mailercloud Blog","url":"https:\/\/www.mailercloud.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.mailercloud.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.mailercloud.com\/blog\/wp-content\/uploads\/2025\/02\/footer_logo.png","contentUrl":"https:\/\/www.mailercloud.com\/blog\/wp-content\/uploads\/2025\/02\/footer_logo.png","width":141,"height":30,"caption":"Mailercloud Blog"},"image":{"@id":"https:\/\/www.mailercloud.com\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/mailercloud","https:\/\/x.com\/mailercloud","https:\/\/www.linkedin.com\/company\/mailercloud\/","https:\/\/www.instagram.com\/mailercloud\/","https:\/\/www.youtube.com\/channel\/UCslSwv-TECN8rLvFM8wRlog"]},{"@type":"Person","@id":"https:\/\/www.mailercloud.com\/blog\/#\/schema\/person\/0f3151b32a261b5f5df0a7968fa64945","name":"Amar","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.mailercloud.com\/blog\/wp-content\/uploads\/2026\/04\/1547012193070-150x150.jpeg","url":"https:\/\/www.mailercloud.com\/blog\/wp-content\/uploads\/2026\/04\/1547012193070-150x150.jpeg","contentUrl":"https:\/\/www.mailercloud.com\/blog\/wp-content\/uploads\/2026\/04\/1547012193070-150x150.jpeg","caption":"Amar"},"description":"Amar CP is the Co-Founder and Sales Director at Mailercloud, where he leads partnerships, alliances, and customer growth. With over a decade of experience in application development, database architecture, and scaling web systems, Amar brings a rare blend of engineering depth and go-to-market expertise to email marketing. He writes about email deliverability, marketing automation, and helping small businesses grow smarter with data-driven campaigns.","sameAs":["http:\/\/www.mailercloud.com","https:\/\/www.facebook.com\/cherikkapoyil.amar","https:\/\/www.instagram.com\/amar.cp\/","https:\/\/www.linkedin.com\/in\/amarcp\/"],"url":"https:\/\/www.mailercloud.com\/blog\/author\/amarmailercloud-com"}]}},"_links":{"self":[{"href":"https:\/\/www.mailercloud.com\/blog\/wp-json\/wp\/v2\/posts\/5207","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mailercloud.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.mailercloud.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.mailercloud.com\/blog\/wp-json\/wp\/v2\/users\/19"}],"replies":[{"embeddable":true,"href":"https:\/\/www.mailercloud.com\/blog\/wp-json\/wp\/v2\/comments?post=5207"}],"version-history":[{"count":5,"href":"https:\/\/www.mailercloud.com\/blog\/wp-json\/wp\/v2\/posts\/5207\/revisions"}],"predecessor-version":[{"id":5421,"href":"https:\/\/www.mailercloud.com\/blog\/wp-json\/wp\/v2\/posts\/5207\/revisions\/5421"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mailercloud.com\/blog\/wp-json\/wp\/v2\/media\/5346"}],"wp:attachment":[{"href":"https:\/\/www.mailercloud.com\/blog\/wp-json\/wp\/v2\/media?parent=5207"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.mailercloud.com\/blog\/wp-json\/wp\/v2\/categories?post=5207"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.mailercloud.com\/blog\/wp-json\/wp\/v2\/tags?post=5207"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}