<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: InboxGreen</title>
    <description>The latest articles on DEV Community by InboxGreen (@inboxgreen).</description>
    <link>https://dev.to/inboxgreen</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3946796%2F0dc62a6f-e414-42ce-878d-f28795bf03f4.png</url>
      <title>DEV Community: InboxGreen</title>
      <link>https://dev.to/inboxgreen</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/inboxgreen"/>
    <language>en</language>
    <item>
      <title>SPF ~all softfail: what it means and when to switch to -all</title>
      <dc:creator>InboxGreen</dc:creator>
      <pubDate>Tue, 09 Jun 2026 16:15:00 +0000</pubDate>
      <link>https://dev.to/inboxgreen/spf-all-softfail-what-it-means-and-when-to-switch-to-all-4d7f</link>
      <guid>https://dev.to/inboxgreen/spf-all-softfail-what-it-means-and-when-to-switch-to-all-4d7f</guid>
      <description>&lt;p&gt;When a checker flags &lt;code&gt;~all&lt;/code&gt; with a warning, a lot of people assume something is broken. It is not. SPF softfail is a valid and common configuration. The warning is a reminder that a stricter setting exists, not an error that needs immediate attention.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the all mechanisms mean
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;~all&lt;/code&gt;: softfail. Emails from unlisted senders are flagged as suspicious but still delivered.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-all&lt;/code&gt;: hardfail. Emails from unlisted senders should be rejected.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;?all&lt;/code&gt;: neutral. No guidance given to receivers. Avoid this.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;+all&lt;/code&gt;: pass everything. Never use this.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  When softfail is the right choice
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;~all&lt;/code&gt; is appropriate when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You are still auditing which services send email on your behalf&lt;/li&gt;
&lt;li&gt;You recently added a new sending platform and have not confirmed it is covered in your SPF record yet&lt;/li&gt;
&lt;li&gt;You are in the early stages of setting up authentication&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Softfail keeps mistakes recoverable. If you miss a sending service, hardfail blocks legitimate email. Softfail lets it through while still flagging that something looks off.&lt;/p&gt;

&lt;h2&gt;
  
  
  When to switch to -all
&lt;/h2&gt;

&lt;p&gt;Switch to &lt;code&gt;-all&lt;/code&gt; when you are confident every legitimate sending source is listed in your SPF record. Before switching:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Audit every service that sends email using your domain (transactional, marketing, support, calendar invites)&lt;/li&gt;
&lt;li&gt;Confirm all of them are covered by an &lt;code&gt;include:&lt;/code&gt; or &lt;code&gt;ip4:&lt;/code&gt; mechanism in your record&lt;/li&gt;
&lt;li&gt;Run a check at &lt;a href="https://inboxgreen.email/check" rel="noopener noreferrer"&gt;InboxGreen&lt;/a&gt; and confirm SPF passes cleanly&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Then change &lt;code&gt;~all&lt;/code&gt; to &lt;code&gt;-all&lt;/code&gt; in your existing record:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;v=spf1 include:_spf.google.com include:sendgrid.net -all
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No other changes needed. Save and wait a few minutes for propagation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Does it matter if you have DMARC enforcement?
&lt;/h2&gt;

&lt;p&gt;With DMARC at &lt;code&gt;p=quarantine&lt;/code&gt; or &lt;code&gt;p=reject&lt;/code&gt;, the practical difference between &lt;code&gt;~all&lt;/code&gt; and &lt;code&gt;-all&lt;/code&gt; is small. DMARC enforcement handles failures regardless of the SPF &lt;code&gt;all&lt;/code&gt; policy. The main reason to switch to &lt;code&gt;-all&lt;/code&gt; is to give non-DMARC-aware providers a stronger signal and add a defense-in-depth layer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Verify it
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dig TXT yourdomain.com | &lt;span class="nb"&gt;grep &lt;/span&gt;spf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Confirm you still have exactly one SPF record and it ends with &lt;code&gt;-all&lt;/code&gt;. Run a full check at &lt;a href="https://inboxgreen.email/check" rel="noopener noreferrer"&gt;InboxGreen&lt;/a&gt; to confirm SPF still passes after the change.&lt;/p&gt;

&lt;p&gt;For the full guide with verification steps and common mistakes: &lt;a href="https://inboxgreen.email/fix/spf-softfail" rel="noopener noreferrer"&gt;SPF softfail: fix guide&lt;/a&gt;&lt;/p&gt;

</description>
      <category>email</category>
      <category>dns</category>
      <category>devops</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Missing List-Unsubscribe header: what Gmail and Yahoo now require</title>
      <dc:creator>InboxGreen</dc:creator>
      <pubDate>Sat, 06 Jun 2026 22:10:00 +0000</pubDate>
      <link>https://dev.to/inboxgreen/missing-list-unsubscribe-header-what-gmail-and-yahoo-now-require-16nd</link>
      <guid>https://dev.to/inboxgreen/missing-list-unsubscribe-header-what-gmail-and-yahoo-now-require-16nd</guid>
      <description>&lt;p&gt;Since February 2024, Gmail and Yahoo require bulk senders (5,000+ emails per day) to include a &lt;code&gt;List-Unsubscribe&lt;/code&gt; header in every marketing email. Miss it and you are in violation of their sender requirements. Even below that threshold, missing this header is one of the faster ways to accumulate spam complaints.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the header does
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;List-Unsubscribe&lt;/code&gt; tells inbox providers where to send unsubscribe requests on behalf of the recipient. When present, Gmail shows a visible "Unsubscribe" link next to the sender name at the top of the email.&lt;/p&gt;

&lt;p&gt;When a recipient clicks it, they unsubscribe cleanly instead of hitting "Report spam." Spam reports damage your sender reputation. Clean unsubscribes do not. This header converts would-be complainers into clean unsubscribes.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you need to include
&lt;/h2&gt;

&lt;p&gt;Two headers are required for full compliance:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;List-Unsubscribe: &amp;lt;mailto:unsub@yourdomain.com&amp;gt;, &amp;lt;https://yourdomain.com/unsubscribe?uid=123&amp;gt;
List-Unsubscribe-Post: List-Unsubscribe=One-Click
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;List-Unsubscribe-Post&lt;/code&gt; header is what enables one-click unsubscribe, which is specifically what Gmail and Yahoo require. The &lt;code&gt;mailto:&lt;/code&gt; is a fallback for older clients.&lt;/p&gt;

&lt;p&gt;Your unsubscribe URL must handle a POST request and actually remove the contact from your list.&lt;/p&gt;

&lt;h2&gt;
  
  
  Adding it in PHP
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$headers&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'List-Unsubscribe: &amp;lt;mailto:unsub@yourdomain.com&amp;gt;, &amp;lt;https://yourdomain.com/unsubscribe?uid='&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;$uid&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s1"&gt;'&amp;gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$headers&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'List-Unsubscribe-Post: List-Unsubscribe=One-Click'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  In ESPs
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Mailchimp:&lt;/strong&gt; Added automatically when you use the standard unsubscribe footer. Do not remove it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SendGrid:&lt;/strong&gt; Settings &amp;gt; Tracking &amp;gt; Subscription Tracking. Enable it and SendGrid adds the header automatically. For API sends, add it manually in the &lt;code&gt;headers&lt;/code&gt; object of your payload.&lt;/p&gt;

&lt;h2&gt;
  
  
  Verify it worked
&lt;/h2&gt;

&lt;p&gt;Send a test to a Gmail address. If the header is present, Gmail shows "Unsubscribe" next to the sender name. You can also open Show original and search for &lt;code&gt;List-Unsubscribe&lt;/code&gt; in the raw headers.&lt;/p&gt;

&lt;p&gt;Run a full check at &lt;a href="https://inboxgreen.email/check" rel="noopener noreferrer"&gt;InboxGreen&lt;/a&gt; to verify alongside SPF, DKIM, and DMARC.&lt;/p&gt;

&lt;p&gt;For the full guide with code examples and common mistakes: &lt;a href="https://inboxgreen.email/fix/list-unsubscribe-missing" rel="noopener noreferrer"&gt;List-Unsubscribe missing: fix guide&lt;/a&gt;&lt;/p&gt;

</description>
      <category>email</category>
      <category>webdev</category>
      <category>devops</category>
      <category>javascript</category>
    </item>
    <item>
      <title>We Checked SPF, DKIM, and DMARC on 186 Popular Domains. Only 69% Passed All Three.</title>
      <dc:creator>InboxGreen</dc:creator>
      <pubDate>Sat, 06 Jun 2026 11:47:58 +0000</pubDate>
      <link>https://dev.to/inboxgreen/we-checked-spf-dkim-and-dmarc-on-186-popular-domains-only-69-passed-all-three-21ih</link>
      <guid>https://dev.to/inboxgreen/we-checked-spf-dkim-and-dmarc-on-186-popular-domains-only-69-passed-all-three-21ih</guid>
      <description>&lt;p&gt;In June 2026, we ran automated SPF, DKIM, and DMARC checks against 186 publicly&lt;br&gt;
known domains across email tools, SaaS platforms, Shopify stores, WordPress hosting&lt;br&gt;
providers, and developer infrastructure companies.&lt;/p&gt;

&lt;p&gt;The goal was simple: how well do well-known, technical companies actually handle&lt;br&gt;
email authentication on their own domains?&lt;/p&gt;

&lt;p&gt;The answer was worse than expected.&lt;/p&gt;

&lt;h2&gt;
  
  
  The numbers
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;90.3%&lt;/strong&gt; had a passing SPF record&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;86%&lt;/strong&gt; had detectable DKIM (on standard selectors)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;81.7%&lt;/strong&gt; had enforced DMARC (p=quarantine or p=reject)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;69.4%&lt;/strong&gt; passed all three checks together&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nearly 1 in 3 well-known domains had at least one gap.&lt;/p&gt;

&lt;h2&gt;
  
  
  What each check means
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;SPF&lt;/strong&gt; tells receiving mail servers which IP addresses are allowed to send email&lt;br&gt;
for your domain. A missing or misconfigured SPF record means any server can send&lt;br&gt;
as you.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DKIM&lt;/strong&gt; adds a cryptographic signature to outgoing mail. Receivers verify the&lt;br&gt;
signature against a public key in your DNS. If DKIM is missing, spoofed messages&lt;br&gt;
are indistinguishable from real ones.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DMARC&lt;/strong&gt; ties SPF and DKIM together and tells receivers what to do when mail&lt;br&gt;
fails both checks. &lt;code&gt;p=none&lt;/code&gt; means do nothing. &lt;code&gt;p=quarantine&lt;/code&gt; means send to spam.&lt;br&gt;
&lt;code&gt;p=reject&lt;/code&gt; means block it entirely.&lt;/p&gt;

&lt;h2&gt;
  
  
  Category breakdown
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Domains&lt;/th&gt;
&lt;th&gt;All Three Pass&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Developer Tools&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;92%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Email Service Providers&lt;/td&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;td&gt;83%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SaaS Platforms&lt;/td&gt;
&lt;td&gt;38&lt;/td&gt;
&lt;td&gt;71%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;E-commerce&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;75%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Shopify Stores&lt;/td&gt;
&lt;td&gt;28&lt;/td&gt;
&lt;td&gt;57%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WordPress Hosting&lt;/td&gt;
&lt;td&gt;18&lt;/td&gt;
&lt;td&gt;61%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Developer tool companies (Cloudflare, Vercel, Netlify, DigitalOcean, GitHub) had&lt;br&gt;
the strongest authentication hygiene by a significant margin. Shopify stores and&lt;br&gt;
WordPress hosts had the worst.&lt;/p&gt;

&lt;h2&gt;
  
  
  Some findings worth noting
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Bluehost, Dreamhost, and Hostgator&lt;/strong&gt; all had DMARC at &lt;code&gt;p=none&lt;/code&gt; on their own&lt;br&gt;
domains. These three companies actively recommend DMARC to their customers in&lt;br&gt;
their own documentation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Backlinko.com&lt;/strong&gt; had SPF returning a fail result and DKIM not detected on any&lt;br&gt;
tested selector. This is a widely-read SEO publication that covers email&lt;br&gt;
deliverability topics.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Flywheel&lt;/strong&gt; (WordPress hosting) had no DMARC record at all.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Three email marketing platforms&lt;/strong&gt; (ConvertKit, Drip, Campaign Monitor) had&lt;br&gt;
DMARC at &lt;code&gt;p=none&lt;/code&gt;. These are companies that send email on behalf of their&lt;br&gt;
customers and publish guidance on DMARC best practices.&lt;/p&gt;

&lt;h2&gt;
  
  
  How we ran the checks
&lt;/h2&gt;

&lt;p&gt;All checks used DNS lookups against public records. No emails were sent. No&lt;br&gt;
private systems were accessed.&lt;/p&gt;

&lt;p&gt;DKIM is checked by probing a predefined list of common selectors: &lt;code&gt;selector1&lt;/code&gt;,&lt;br&gt;
&lt;code&gt;selector2&lt;/code&gt;, &lt;code&gt;default&lt;/code&gt;, &lt;code&gt;google&lt;/code&gt;, &lt;code&gt;mail&lt;/code&gt;, &lt;code&gt;smtp&lt;/code&gt;, &lt;code&gt;amazonses&lt;/code&gt;, &lt;code&gt;sendgrid&lt;/code&gt;,&lt;br&gt;
&lt;code&gt;mailgun&lt;/code&gt;, &lt;code&gt;postmark&lt;/code&gt;, &lt;code&gt;sparkpost&lt;/code&gt;, &lt;code&gt;zoho&lt;/code&gt;, &lt;code&gt;protonmail&lt;/code&gt;, and others. A DKIM&lt;br&gt;
fail in this report means no valid record was found on any of those selectors.&lt;br&gt;
Domains using custom selectors not in our list may appear as failing even if&lt;br&gt;
DKIM is actually configured.&lt;/p&gt;

&lt;p&gt;Date of scan: June 3, 2026. DNS records change over time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Check your own domain
&lt;/h2&gt;

&lt;p&gt;The tool we used is free and takes about 10 seconds. No signup required.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://inboxgreen.email/check" rel="noopener noreferrer"&gt;Run a free check on your domain&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Full report with category breakdown, domain table, and raw CSV download:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://inboxgreen.email/research/email-authentication-report-2026" rel="noopener noreferrer"&gt;Email Authentication Report 2026&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>email</category>
      <category>security</category>
      <category>devops</category>
      <category>webdev</category>
    </item>
    <item>
      <title>DMARC alignment failure: SPF and DKIM pass but DMARC still fails</title>
      <dc:creator>InboxGreen</dc:creator>
      <pubDate>Fri, 05 Jun 2026 22:05:00 +0000</pubDate>
      <link>https://dev.to/inboxgreen/dmarc-alignment-failure-spf-and-dkim-pass-but-dmarc-still-fails-4anm</link>
      <guid>https://dev.to/inboxgreen/dmarc-alignment-failure-spf-and-dkim-pass-but-dmarc-still-fails-4anm</guid>
      <description>&lt;p&gt;You check your email headers. SPF shows &lt;code&gt;pass&lt;/code&gt;. DKIM shows &lt;code&gt;pass&lt;/code&gt;. But DMARC shows &lt;code&gt;fail&lt;/code&gt;. How is that possible?&lt;/p&gt;

&lt;p&gt;The answer is alignment. DMARC does not just check whether SPF or DKIM passed. It checks whether they passed for the right domain, specifically the domain in your &lt;code&gt;From&lt;/code&gt; header.&lt;/p&gt;

&lt;h2&gt;
  
  
  What alignment means
&lt;/h2&gt;

&lt;p&gt;When you send email, multiple domain identifiers are in play:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The visible &lt;code&gt;From&lt;/code&gt; address (what your recipient sees)&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;Return-Path&lt;/code&gt; or envelope sender (used by SPF)&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;d=&lt;/code&gt; domain in the DKIM-Signature header (used by DKIM)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;DMARC requires at least one of these to match your &lt;code&gt;From&lt;/code&gt; domain. If SPF passes for &lt;code&gt;mail.sendingservice.com&lt;/code&gt; but your &lt;code&gt;From&lt;/code&gt; is &lt;code&gt;you@yourdomain.com&lt;/code&gt;, that is a misalignment and DMARC fails even though SPF technically passed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this happens most often
&lt;/h2&gt;

&lt;p&gt;When you send through an ESP (Mailchimp, SendGrid, HubSpot) without setting up custom domain authentication, the ESP sends with its own domain in the &lt;code&gt;Return-Path&lt;/code&gt; and signs DKIM with its own selector. Authentication passes for the ESP's domain, not yours.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fix
&lt;/h2&gt;

&lt;p&gt;Enable custom domain authentication in your ESP. Every major ESP supports this.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mailchimp:&lt;/strong&gt;&lt;br&gt;
Account &amp;gt; Domains &amp;gt; verify your sending domain &amp;gt; add the CNAME records they provide.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SendGrid:&lt;/strong&gt;&lt;br&gt;
Settings &amp;gt; Sender Authentication &amp;gt; Authenticate Your Domain &amp;gt; add the CNAME records.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Google Workspace:&lt;/strong&gt;&lt;br&gt;
Admin console &amp;gt; Apps &amp;gt; Google Workspace &amp;gt; Gmail &amp;gt; Authenticate email &amp;gt; enable DKIM. Google signs with your domain automatically once active.&lt;/p&gt;

&lt;p&gt;Once complete, the ESP signs outgoing email with your domain in the &lt;code&gt;d=&lt;/code&gt; tag. DKIM alignment passes. DMARC passes.&lt;/p&gt;
&lt;h2&gt;
  
  
  Verify it worked
&lt;/h2&gt;

&lt;p&gt;Send a test from your ESP to a Gmail address. Open Show original and look for:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dkim=pass header.d=yourdomain.com
dmarc=pass
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If &lt;code&gt;header.d=&lt;/code&gt; still shows the ESP's domain, either the DNS records have not propagated yet or custom authentication was not fully enabled.&lt;/p&gt;

&lt;p&gt;You can also run a full check at &lt;a href="https://inboxgreen.email/check" rel="noopener noreferrer"&gt;InboxGreen&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For the full guide with per-ESP steps and common mistakes: &lt;a href="https://inboxgreen.email/fix/dmarc-alignment-failure" rel="noopener noreferrer"&gt;DMARC alignment failure: fix guide&lt;/a&gt;&lt;/p&gt;

</description>
      <category>email</category>
      <category>security</category>
      <category>devops</category>
      <category>dns</category>
    </item>
    <item>
      <title>DMARC p=none is not protecting your domain: when to upgrade</title>
      <dc:creator>InboxGreen</dc:creator>
      <pubDate>Thu, 04 Jun 2026 22:25:00 +0000</pubDate>
      <link>https://dev.to/inboxgreen/dmarc-pnone-is-not-protecting-your-domain-when-to-upgrade-4be9</link>
      <guid>https://dev.to/inboxgreen/dmarc-pnone-is-not-protecting-your-domain-when-to-upgrade-4be9</guid>
      <description>&lt;p&gt;&lt;code&gt;p=none&lt;/code&gt; is the right place to start with DMARC. It is not the right place to stay.&lt;/p&gt;

&lt;p&gt;Most teams add a DMARC record, see it show as passing, and move on. But &lt;code&gt;p=none&lt;/code&gt; means receiving servers do nothing when authentication fails. They log it, maybe send you a report, and deliver the email anyway. Someone spoofing your domain while you are on &lt;code&gt;p=none&lt;/code&gt; has a clear path to your recipients' inboxes.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the policy tag controls
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;p=&lt;/code&gt; tag tells receiving servers what to do with emails that fail DMARC evaluation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;p=none&lt;/code&gt;: no action, monitor and report only&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;p=quarantine&lt;/code&gt;: deliver to spam or junk folder&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;p=reject&lt;/code&gt;: refuse delivery entirely&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of these affect emails that pass DMARC. The policy only kicks in on failures.&lt;/p&gt;

&lt;h2&gt;
  
  
  When to upgrade
&lt;/h2&gt;

&lt;p&gt;Before moving off &lt;code&gt;p=none&lt;/code&gt;, you need confidence that SPF and DKIM are passing for all your legitimate sending streams:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You have been on &lt;code&gt;p=none&lt;/code&gt; for at least two to four weeks and are receiving aggregate reports&lt;/li&gt;
&lt;li&gt;The reports show no legitimate sources failing authentication&lt;/li&gt;
&lt;li&gt;DKIM is enabled for every service that sends on your behalf&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Skip this and go straight to &lt;code&gt;p=reject&lt;/code&gt; and you risk blocking your own email.&lt;/p&gt;

&lt;h2&gt;
  
  
  The safe upgrade path
&lt;/h2&gt;

&lt;p&gt;Do not jump straight to &lt;code&gt;p=reject&lt;/code&gt;. Use the &lt;code&gt;pct&lt;/code&gt; tag to roll out gradually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;v=DMARC1; p=quarantine; pct=10; rua=mailto:dmarc@yourdomain.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;pct=10&lt;/code&gt; applies the quarantine policy to only 10% of failing emails. Monitor your reports for a week or two. If no legitimate email is affected, increase to &lt;code&gt;pct=50&lt;/code&gt;, then &lt;code&gt;pct=100&lt;/code&gt;. Move to &lt;code&gt;p=reject&lt;/code&gt; when you are confident nothing legitimate is failing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Check your current setup
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dig TXT _dmarc.yourdomain.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or run a full scan at &lt;a href="https://inboxgreen.email/check" rel="noopener noreferrer"&gt;InboxGreen&lt;/a&gt;, which shows your current policy, &lt;code&gt;pct&lt;/code&gt; value, and alignment settings in one view.&lt;/p&gt;

&lt;p&gt;For the full guide with rollout steps and common mistakes: &lt;a href="https://inboxgreen.email/fix/dmarc-policy-none" rel="noopener noreferrer"&gt;DMARC p=none upgrade guide&lt;/a&gt;&lt;/p&gt;

</description>
      <category>email</category>
      <category>dns</category>
      <category>security</category>
      <category>devops</category>
    </item>
    <item>
      <title>SPF PermError from too many DNS lookups: what the 10-lookup limit means</title>
      <dc:creator>InboxGreen</dc:creator>
      <pubDate>Wed, 03 Jun 2026 22:20:00 +0000</pubDate>
      <link>https://dev.to/inboxgreen/spf-permerror-from-too-many-dns-lookups-what-the-10-lookup-limit-means-26ag</link>
      <guid>https://dev.to/inboxgreen/spf-permerror-from-too-many-dns-lookups-what-the-10-lookup-limit-means-26ag</guid>
      <description>&lt;p&gt;SPF has a hard limit of 10 DNS-querying mechanisms per record. Hit that limit and you get a &lt;code&gt;PermError&lt;/code&gt;, the same hard failure as having two SPF records. Your record can look perfectly normal from the outside while silently failing for anyone who queries it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What counts as a lookup
&lt;/h2&gt;

&lt;p&gt;Not every mechanism in an SPF record triggers a DNS lookup.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;These count toward the limit:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;include:&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;a&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mx&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ptr&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;exists&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;redirect=&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;These do not count:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ip4:&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ip6:&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;all&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The catch is that &lt;code&gt;include:&lt;/code&gt; mechanisms are recursive. If your record has &lt;code&gt;include:sendgrid.net&lt;/code&gt; and SendGrid's SPF record itself contains three more &lt;code&gt;include:&lt;/code&gt; entries, those all count toward your limit. You can hit 10 with just four or five top-level includes on a typical SaaS stack.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to count your current lookups
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dig TXT yourdomain.com | &lt;span class="nb"&gt;grep &lt;/span&gt;spf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then trace each &lt;code&gt;include:&lt;/code&gt; manually, or run a check at &lt;a href="https://inboxgreen.email/check" rel="noopener noreferrer"&gt;InboxGreen&lt;/a&gt; which counts the full resolved lookup depth automatically.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fix: replace includes with IP addresses
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;ip4:&lt;/code&gt; and &lt;code&gt;ip6:&lt;/code&gt; mechanisms do not count as lookups. The goal is to replace &lt;code&gt;include:&lt;/code&gt; entries with the actual IP ranges they resolve to.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Before:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;v=spf1 include:_spf.google.com include:sendgrid.net include:mailgun.org include:servers.mcsv.net ~all
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;After:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;v=spf1 include:_spf.google.com ip4:198.37.144.0/20 ip4:198.21.0.0/21 ip4:209.61.151.0/24 ~all
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Keep &lt;code&gt;include:&lt;/code&gt; only for services like Google Workspace that rotate IPs and maintain their own SPF record. Flatten everything else to direct IP ranges.&lt;/p&gt;

&lt;p&gt;One downside of flattening: provider IP ranges change over time. Check once a quarter and update, or use a service like AutoSPF that handles updates automatically.&lt;/p&gt;

&lt;h2&gt;
  
  
  Verify the fix
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dig TXT yourdomain.com | &lt;span class="nb"&gt;grep &lt;/span&gt;spf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then run a full scan at &lt;a href="https://inboxgreen.email/check" rel="noopener noreferrer"&gt;InboxGreen&lt;/a&gt; to confirm the lookup count is now under 10 and the &lt;code&gt;PermError&lt;/code&gt; is gone.&lt;/p&gt;

&lt;p&gt;For the full guide with verification steps and common mistakes: &lt;a href="https://inboxgreen.email/fix/spf-too-many-dns-lookups" rel="noopener noreferrer"&gt;SPF too many DNS lookups: fix guide&lt;/a&gt;&lt;/p&gt;

</description>
      <category>email</category>
      <category>dns</category>
      <category>devops</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Two SPF records on one domain causes a PermError: how to merge them</title>
      <dc:creator>InboxGreen</dc:creator>
      <pubDate>Tue, 02 Jun 2026 22:15:00 +0000</pubDate>
      <link>https://dev.to/inboxgreen/two-spf-records-on-one-domain-causes-a-permerror-how-to-merge-them-5gn8</link>
      <guid>https://dev.to/inboxgreen/two-spf-records-on-one-domain-causes-a-permerror-how-to-merge-them-5gn8</guid>
      <description>&lt;p&gt;This is one of the most common email authentication mistakes, and it almost always happens when a developer follows a setup guide without checking whether an SPF record already exists.&lt;/p&gt;

&lt;p&gt;You add Mailchimp, follow their DNS setup instructions, and add the SPF record they specify. Six months later you set up SendGrid, follow their guide, and add another SPF record. Now you have two TXT records starting with &lt;code&gt;v=spf1&lt;/code&gt; at your domain root and SPF is completely broken.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why two records break everything
&lt;/h2&gt;

&lt;p&gt;RFC 7208 (the SPF specification) is explicit: a domain must not publish more than one SPF record. When a receiving server queries your domain and gets two records back, it returns a &lt;code&gt;PermError&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;PermError&lt;/code&gt; is not a soft failure. It means SPF evaluation cannot be completed and the result is treated as a hard failure by most providers. Both records could contain perfectly valid entries and it would not matter. Two records equals &lt;code&gt;PermError&lt;/code&gt; equals broken SPF.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to check if you have this problem
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dig TXT yourdomain.com | &lt;span class="nb"&gt;grep &lt;/span&gt;spf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you see two lines starting with &lt;code&gt;v=spf1&lt;/code&gt;, you have a problem. You can also run a check at &lt;a href="https://inboxgreen.email/check" rel="noopener noreferrer"&gt;InboxGreen&lt;/a&gt; which flags this specifically in its results.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fix: merge into one record
&lt;/h2&gt;

&lt;p&gt;Take every &lt;code&gt;include:&lt;/code&gt;, &lt;code&gt;ip4:&lt;/code&gt;, and &lt;code&gt;ip6:&lt;/code&gt; mechanism from both records and combine them into a single record.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Before:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;v=spf1 include:_spf.google.com ~all
v=spf1 include:sendgrid.net ~all
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;After:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;v=spf1 include:_spf.google.com include:sendgrid.net ~all
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Edit the first record with the merged value. Delete the second record entirely. Order does not matter.&lt;/p&gt;

&lt;h2&gt;
  
  
  Verify the fix
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dig TXT yourdomain.com | &lt;span class="nb"&gt;grep &lt;/span&gt;spf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see exactly one result. Run a full check at &lt;a href="https://inboxgreen.email/check" rel="noopener noreferrer"&gt;InboxGreen&lt;/a&gt; to confirm the &lt;code&gt;PermError&lt;/code&gt; is gone.&lt;/p&gt;

&lt;p&gt;For the full guide with steps for Cloudflare, Namecheap, and GoDaddy: &lt;a href="https://inboxgreen.email/fix/multiple-spf-records" rel="noopener noreferrer"&gt;Multiple SPF records: fix guide&lt;/a&gt;&lt;/p&gt;

</description>
      <category>email</category>
      <category>devops</category>
      <category>dns</category>
      <category>webdev</category>
    </item>
    <item>
      <title>DKIM selector not found: how to enable DKIM signing for your domain</title>
      <dc:creator>InboxGreen</dc:creator>
      <pubDate>Mon, 01 Jun 2026 22:10:00 +0000</pubDate>
      <link>https://dev.to/inboxgreen/dkim-selector-not-found-how-to-enable-dkim-signing-for-your-domain-3fom</link>
      <guid>https://dev.to/inboxgreen/dkim-selector-not-found-how-to-enable-dkim-signing-for-your-domain-3fom</guid>
      <description>&lt;p&gt;DKIM selector not found means a checker looked at the common selector locations for your domain and found no public key. This is one of the more confusing email authentication problems because the fix lives in two separate places: your email provider's admin panel and your DNS.&lt;/p&gt;

&lt;h2&gt;
  
  
  How DKIM works
&lt;/h2&gt;

&lt;p&gt;Your mail server signs each outgoing email with a private key. The matching public key is published in DNS at a record like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;google._domainkey.yourdomain.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When a receiving server gets your email, it looks up that record and uses the public key to verify the signature. If the record does not exist, DKIM returns &lt;code&gt;none&lt;/code&gt; and verification cannot happen.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why both steps are required
&lt;/h2&gt;

&lt;p&gt;This is where most people get stuck. You need to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Enable DKIM signing in your email provider's admin panel so outgoing mail gets signed&lt;/li&gt;
&lt;li&gt;Add the TXT or CNAME record to your DNS so receiving servers can verify the signature&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Missing either step means DKIM will not pass. Adding the DNS record without enabling signing in the provider does nothing. Enabling signing without the DNS record means every verification attempt fails.&lt;/p&gt;

&lt;h2&gt;
  
  
  Provider-specific steps
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Google Workspace:&lt;/strong&gt;&lt;br&gt;
Admin console &amp;gt; Apps &amp;gt; Google Workspace &amp;gt; Gmail &amp;gt; Authenticate email &amp;gt; Generate new record. Copy the TXT record name and value, add to DNS, then click Start authentication.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Microsoft 365:&lt;/strong&gt;&lt;br&gt;
Admin Center &amp;gt; Security &amp;gt; DKIM &amp;gt; select your domain &amp;gt; Enable. Microsoft gives you two CNAME records to add to DNS.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SendGrid:&lt;/strong&gt;&lt;br&gt;
Settings &amp;gt; Sender Authentication &amp;gt; Authenticate Your Domain. Two CNAME records, add both to DNS, then click Verify.&lt;/p&gt;

&lt;h2&gt;
  
  
  After adding the records
&lt;/h2&gt;

&lt;p&gt;DNS propagation usually takes 5 to 30 minutes. Google Workspace can take up to 48 hours to confirm the key is active on their end. Do not assume it is broken after 10 minutes.&lt;/p&gt;

&lt;p&gt;To verify, send a test email to a Gmail address and open Show original. Look for &lt;code&gt;dkim=pass&lt;/code&gt; in the Authentication-Results header.&lt;/p&gt;

&lt;p&gt;You can also run a full scan at &lt;a href="https://inboxgreen.email/check" rel="noopener noreferrer"&gt;InboxGreen&lt;/a&gt;, which checks all common selectors automatically.&lt;/p&gt;

&lt;p&gt;For the full step-by-step guide per provider including common mistakes and FAQ: &lt;a href="https://inboxgreen.email/fix/dkim-selector-not-found" rel="noopener noreferrer"&gt;DKIM selector not found: fix guide&lt;/a&gt;&lt;/p&gt;

</description>
      <category>email</category>
      <category>dns</category>
      <category>security</category>
      <category>webdev</category>
    </item>
    <item>
      <title>SPF record not found: why this quietly breaks email delivery</title>
      <dc:creator>InboxGreen</dc:creator>
      <pubDate>Sun, 31 May 2026 22:05:00 +0000</pubDate>
      <link>https://dev.to/inboxgreen/spf-record-not-found-why-this-quietly-breaks-email-delivery-31mm</link>
      <guid>https://dev.to/inboxgreen/spf-record-not-found-why-this-quietly-breaks-email-delivery-31mm</guid>
      <description>&lt;p&gt;SPF not found does not immediately bounce your email. It returns a result of &lt;code&gt;none&lt;/code&gt;, which most providers treat as a weak negative signal rather than a hard failure.&lt;/p&gt;

&lt;p&gt;The problem is compounding. Pair a missing SPF with a missing DKIM or a strict receiving policy and your mail starts disappearing into spam with no bounce notification and no way to know it happened.&lt;/p&gt;

&lt;h2&gt;
  
  
  What SPF does
&lt;/h2&gt;

&lt;p&gt;SPF (Sender Policy Framework) is a TXT record at your domain root that lists which mail servers and services are authorized to send email from your domain.&lt;/p&gt;

&lt;p&gt;When a receiving server gets your email, it checks this record against the IP that sent the message. No record means no list. The check returns &lt;code&gt;none&lt;/code&gt; and the provider has nothing to verify against.&lt;/p&gt;

&lt;h2&gt;
  
  
  Adding your first SPF record
&lt;/h2&gt;

&lt;p&gt;The record goes at the root of your domain using &lt;code&gt;@&lt;/code&gt; as the host:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Type:  TXT
Name:  @
Value: v=spf1 include:YOUR-PROVIDER ~all
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Common provider values:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Google Workspace:&lt;/strong&gt; &lt;code&gt;include:_spf.google.com&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Microsoft 365:&lt;/strong&gt; &lt;code&gt;include:spf.protection.outlook.com&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SendGrid:&lt;/strong&gt; &lt;code&gt;include:sendgrid.net&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mailgun:&lt;/strong&gt; &lt;code&gt;include:mailgun.org&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you send through multiple services, combine them into one record:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;v=spf1 include:_spf.google.com include:sendgrid.net ~all
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  One rule you must not break
&lt;/h2&gt;

&lt;p&gt;Only one TXT record starting with &lt;code&gt;v=spf1&lt;/code&gt; is allowed per domain. If you add a second one, SPF returns a &lt;code&gt;PermError&lt;/code&gt; and fails completely regardless of what either record says. If you already have an SPF record, edit the existing one instead of creating a new one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start with ~all
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;~all&lt;/code&gt; at the end is a softfail. It flags but still delivers mail from unlisted senders. Use this while you are confirming all your sending services are covered. Switch to &lt;code&gt;-all&lt;/code&gt; once nothing legitimate is missing from the record.&lt;/p&gt;

&lt;h2&gt;
  
  
  Verify it worked
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dig TXT yourdomain.com | &lt;span class="nb"&gt;grep &lt;/span&gt;spf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see exactly one line starting with &lt;code&gt;v=spf1&lt;/code&gt;. You can also run a full check at &lt;a href="https://inboxgreen.email/check" rel="noopener noreferrer"&gt;InboxGreen&lt;/a&gt; to see SPF, DKIM, and DMARC together in one scan.&lt;/p&gt;

&lt;p&gt;For the full guide with provider-specific steps and common mistakes: &lt;a href="https://inboxgreen.email/fix/spf-record-not-found" rel="noopener noreferrer"&gt;SPF record not found: fix guide&lt;/a&gt;&lt;/p&gt;

</description>
      <category>email</category>
      <category>dns</category>
      <category>webdev</category>
      <category>devops</category>
    </item>
    <item>
      <title>Your domain has no DMARC record: what that means for your email</title>
      <dc:creator>InboxGreen</dc:creator>
      <pubDate>Sun, 31 May 2026 10:32:40 +0000</pubDate>
      <link>https://dev.to/inboxgreen/your-domain-has-no-dmarc-record-what-that-means-for-your-email-56gd</link>
      <guid>https://dev.to/inboxgreen/your-domain-has-no-dmarc-record-what-that-means-for-your-email-56gd</guid>
      <description>&lt;p&gt;If you run &lt;code&gt;dig TXT _dmarc.yourdomain.com&lt;/code&gt; and get nothing back, your domain has no DMARC record. That single missing DNS entry has real consequences for inbox placement and domain security.&lt;/p&gt;

&lt;h2&gt;
  
  
  What DMARC actually does
&lt;/h2&gt;

&lt;p&gt;DMARC (Domain-based Message Authentication, Reporting and Conformance) is a DNS policy that tells receiving mail servers what to do when an email claiming to be from your domain fails SPF or DKIM checks.&lt;/p&gt;

&lt;p&gt;Without it, providers like Gmail and Outlook make their own call. That call often involves the spam folder.&lt;/p&gt;

&lt;p&gt;Beyond delivery, DMARC is the only mechanism you have to prevent domain spoofing. Without a record, anyone can send email that appears to come from your domain and receiving servers have no policy to block it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Gmail and Yahoo requirement
&lt;/h2&gt;

&lt;p&gt;Since February 2024, Gmail and Yahoo require a DMARC record for senders sending more than 5,000 emails per day. Below that threshold it is still best practice.&lt;/p&gt;

&lt;p&gt;Missing DMARC is one of the first things bulk email infrastructure checks when deciding whether to trust a sender.&lt;/p&gt;

&lt;h2&gt;
  
  
  The minimum record to add
&lt;/h2&gt;

&lt;p&gt;You do not need a strict policy to start. This is enough to pass the check and begin receiving reports:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Type:  TXT
Name:  _dmarc
Value: v=DMARC1; p=none; rua=mailto:dmarc@yourdomain.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Replace the &lt;code&gt;rua&lt;/code&gt; address with a real mailbox you can read. &lt;code&gt;p=none&lt;/code&gt; means no action is taken on failures, but you start receiving aggregate reports showing exactly what is authenticating and what is not.&lt;/p&gt;

&lt;p&gt;Once SPF and DKIM are passing consistently, upgrade to &lt;code&gt;p=quarantine&lt;/code&gt; or &lt;code&gt;p=reject&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where to add it
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cloudflare:&lt;/strong&gt; DNS &amp;gt; Records &amp;gt; Add record &amp;gt; TXT, name &lt;code&gt;_dmarc&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Namecheap:&lt;/strong&gt; Advanced DNS &amp;gt; Add New Record &amp;gt; TXT, host &lt;code&gt;_dmarc&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GoDaddy:&lt;/strong&gt; DNS &amp;gt; Manage Zones &amp;gt; Add Record &amp;gt; TXT, name &lt;code&gt;_dmarc&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most panels prepend your domain automatically. Use just &lt;code&gt;_dmarc&lt;/code&gt;, not &lt;code&gt;_dmarc.yourdomain.com&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Verify it worked
&lt;/h2&gt;

&lt;p&gt;After saving, wait 5 to 30 minutes, then run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dig TXT _dmarc.yourdomain.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see your record in the answer section. You can also run a free scan at &lt;a href="https://inboxgreen.email/check" rel="noopener noreferrer"&gt;InboxGreen&lt;/a&gt;, which checks DMARC alongside SPF, DKIM, and List-Unsubscribe in one go.&lt;/p&gt;

&lt;p&gt;For the full step-by-step guide including common mistakes and FAQ: &lt;a href="https://inboxgreen.email/fix/dmarc-record-not-found" rel="noopener noreferrer"&gt;DMARC record not found: fix guide&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>security</category>
      <category>webdev</category>
      <category>email</category>
    </item>
    <item>
      <title>SPF record syntax explained: a practical guide for developers</title>
      <dc:creator>InboxGreen</dc:creator>
      <pubDate>Sat, 23 May 2026 05:22:40 +0000</pubDate>
      <link>https://dev.to/inboxgreen/spf-record-syntax-explained-a-practical-guide-for-developers-1kii</link>
      <guid>https://dev.to/inboxgreen/spf-record-syntax-explained-a-practical-guide-for-developers-1kii</guid>
      <description>&lt;p&gt;SPF (Sender Policy Framework) is a DNS record that tells receiving mail servers which servers are allowed to send email on behalf of your domain. If a server not on that list sends email claiming to be from your domain, the receiving server can reject or flag it.&lt;/p&gt;

&lt;p&gt;Understanding the syntax makes it easier to set it up correctly and avoid common mistakes like accidentally hitting the 10-lookup limit.&lt;/p&gt;

&lt;h2&gt;
  
  
  The basic structure
&lt;/h2&gt;

&lt;p&gt;An SPF record is a TXT record on your domain's DNS. It always starts with:&lt;/p&gt;

&lt;p&gt;v=spf1&lt;/p&gt;

&lt;p&gt;After that, you list your authorized senders as mechanisms, then end with an &lt;code&gt;all&lt;/code&gt; directive.&lt;/p&gt;

&lt;p&gt;A typical SPF record looks like this:&lt;/p&gt;

&lt;p&gt;v=spf1 include:_spf.google.com include:spf.sendinblue.com ip4:203.0.113.50 ~all&lt;/p&gt;

&lt;h2&gt;
  
  
  Mechanisms
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;ip4:&lt;/code&gt; and &lt;code&gt;ip6:&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Authorizes a specific IP address or CIDR range.&lt;/p&gt;

&lt;p&gt;ip4:203.0.113.50&lt;br&gt;
ip4:203.0.113.0/24&lt;br&gt;
ip6:2001:db8::1&lt;/p&gt;

&lt;p&gt;Use this when you know the exact IP of a mail server you control.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;include:&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Delegates to another domain's SPF record. Each &lt;code&gt;include:&lt;/code&gt; causes one DNS lookup.&lt;/p&gt;

&lt;p&gt;include:_spf.google.com&lt;br&gt;
include:sendgrid.net&lt;br&gt;
include:spf.mailchimp.com&lt;/p&gt;

&lt;p&gt;Most third-party email services give you an &lt;code&gt;include:&lt;/code&gt; value to add. Each one authorizes all IPs in that service's SPF record.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;a:&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Authorizes the A record of a domain. If the domain's A record matches the IP the email came from, it passes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;mx:&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Authorizes the MX records of a domain. Less common, typically used when your mail server and MX records are the same host.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;ptr:&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Avoid this one. It is slow, unreliable, and deprecated in practice.&lt;/p&gt;

&lt;h2&gt;
  
  
  The &lt;code&gt;all&lt;/code&gt; directive
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;all&lt;/code&gt; at the end controls what happens to mail from servers not on your list:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;~all&lt;/code&gt; (softfail) — fail but usually deliver anyway, marking as suspicious&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-all&lt;/code&gt; (hardfail) — reject the email&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;+all&lt;/code&gt; (pass all) — authorizes everything, which defeats the purpose of SPF entirely&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;?all&lt;/code&gt; (neutral) — no policy, same as having no SPF&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For most senders, &lt;code&gt;~all&lt;/code&gt; is the safe starting point. Once you are confident your record is complete, switch to &lt;code&gt;-all&lt;/code&gt; for stronger protection.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 10-lookup limit
&lt;/h2&gt;

&lt;p&gt;SPF has a hard limit of 10 DNS lookups per evaluation. Each &lt;code&gt;include:&lt;/code&gt;, &lt;code&gt;a:&lt;/code&gt;, &lt;code&gt;mx:&lt;/code&gt;, and &lt;code&gt;ptr:&lt;/code&gt; costs one lookup. Exceed 10 and the SPF check returns &lt;code&gt;permerror&lt;/code&gt;, which effectively means the record fails.&lt;/p&gt;

&lt;p&gt;This is a common problem when a domain uses multiple services: Google Workspace plus Mailchimp plus SendGrid plus a CRM can easily push you over the limit.&lt;/p&gt;

&lt;p&gt;To fix it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Audit your record and count your lookups&lt;/li&gt;
&lt;li&gt;Remove services you are no longer using&lt;/li&gt;
&lt;li&gt;Flatten the record by replacing &lt;code&gt;include:&lt;/code&gt; values with the raw IPs they resolve to (but you will need to update this when the provider changes their IPs)&lt;/li&gt;
&lt;li&gt;Use an SPF flattening service if you have many senders and cannot reduce them&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://inboxgreen.email/tools/spf-lookup" rel="noopener noreferrer"&gt;InboxGreen's SPF lookup tool&lt;/a&gt; shows your current record and flags lookup count issues.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common mistakes
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Multiple SPF records:&lt;/strong&gt; You can only have one TXT SPF record per domain. A second record breaks SPF validation entirely. Merge them into one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wrong domain:&lt;/strong&gt; SPF needs to match the domain in the &lt;code&gt;From:&lt;/code&gt; header for DMARC alignment. If you send from &lt;code&gt;noreply@mail.yourdomain.com&lt;/code&gt;, the SPF record needs to be on &lt;code&gt;mail.yourdomain.com&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Forgetting subdomains:&lt;/strong&gt; SPF on &lt;code&gt;yourdomain.com&lt;/code&gt; does not cover &lt;code&gt;mail.yourdomain.com&lt;/code&gt; or &lt;code&gt;info.yourdomain.com&lt;/code&gt;. Each sending subdomain needs its own record.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Missing &lt;code&gt;all&lt;/code&gt;:&lt;/strong&gt; Every SPF record must end with some form of &lt;code&gt;all&lt;/code&gt;. Without it, the result is undefined.&lt;/p&gt;

&lt;h2&gt;
  
  
  Checking your record
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://inboxgreen.email/check" rel="noopener noreferrer"&gt;InboxGreen's free checker&lt;/a&gt; pulls your SPF record, parses the mechanisms, and runs an authentication check against your domain. No login required.&lt;/p&gt;

</description>
      <category>email</category>
      <category>webdev</category>
      <category>dns</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>How to check if your domain is on an email blacklist (and what to do if it is)</title>
      <dc:creator>InboxGreen</dc:creator>
      <pubDate>Sat, 23 May 2026 05:18:17 +0000</pubDate>
      <link>https://dev.to/inboxgreen/how-to-check-if-your-domain-is-on-an-email-blacklist-and-what-to-do-if-it-is-22ag</link>
      <guid>https://dev.to/inboxgreen/how-to-check-if-your-domain-is-on-an-email-blacklist-and-what-to-do-if-it-is-22ag</guid>
      <description>&lt;p&gt;If your emails are suddenly going to spam or not arriving at all, a blacklist is one of the first things to rule out. Blacklists are databases of IP addresses and domains that have been flagged for sending spam. Major email providers check these lists before deciding where to deliver your mail.&lt;/p&gt;

&lt;p&gt;Here is how to check if you are listed and what to do about it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What gets blacklisted
&lt;/h2&gt;

&lt;p&gt;Both your sending IP address and your domain can be blacklisted independently. An IP blacklisting affects every domain that sends through that IP. A domain blacklisting follows your domain regardless of what IP you send from.&lt;/p&gt;

&lt;p&gt;Common reasons for being blacklisted:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sending to addresses that have not opted in&lt;/li&gt;
&lt;li&gt;High spam complaint rates (anything above 0.1% with Gmail will hurt you)&lt;/li&gt;
&lt;li&gt;Sending to spam trap addresses&lt;/li&gt;
&lt;li&gt;A sudden spike in sending volume from a new domain&lt;/li&gt;
&lt;li&gt;Your shared hosting IP was blacklisted by a different tenant (common on shared servers)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How to check
&lt;/h2&gt;

&lt;p&gt;The fastest way is to use a blacklist lookup tool. &lt;a href="https://inboxgreen.email/tools/blacklist-checker" rel="noopener noreferrer"&gt;InboxGreen has a free blacklist checker&lt;/a&gt; that checks your domain against the major lists used by Gmail, Outlook, and other providers.&lt;/p&gt;

&lt;p&gt;You can also check manually:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Spamhaus&lt;/strong&gt; (spamhaus.org/lookup) is the most important one. Gmail and Microsoft weight Spamhaus heavily. If you are listed here, expect significant deliverability damage.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Barracuda&lt;/strong&gt; (barracudacentral.org/lookups) matters mainly for corporate email delivered through Barracuda gateways, which is common in enterprise environments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MXToolbox&lt;/strong&gt; (mxtoolbox.com/blacklists) checks against around 100 blacklists at once. Free, no account needed, good for a broad sweep.&lt;/p&gt;

&lt;p&gt;If you are on shared hosting (Namecheap, Bluehost, SiteGround), always check the IP address of your mail server too, not just your domain name.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to get delisted
&lt;/h2&gt;

&lt;p&gt;Each blacklist has its own removal process.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Spamhaus:&lt;/strong&gt; Go to spamhaus.org/lookup, enter your IP or domain, and follow the removal link. For legitimate senders who ended up listed by mistake, removal is usually granted within 24-48 hours if you can explain what happened.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Barracuda:&lt;/strong&gt; Fill out the removal request at barracudacentral.org/lookups. Approved within a few hours for clean IPs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SORBS:&lt;/strong&gt; Slower process, often requires waiting out the listing period and demonstrating clean sending behavior over time.&lt;/p&gt;

&lt;p&gt;Before requesting removal from any list, fix the underlying problem first. If you request removal without stopping whatever caused the listing, you will be relisted quickly and future removal requests may be ignored or delayed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Staying off blacklists
&lt;/h2&gt;

&lt;p&gt;The best approach is prevention:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Keep spam complaint rates below 0.08% (Google's threshold before they start filtering)&lt;/li&gt;
&lt;li&gt;Never send to purchased or scraped lists&lt;/li&gt;
&lt;li&gt;Set up SPF, DKIM, and DMARC — authenticated domains are less likely to be listed&lt;/li&gt;
&lt;li&gt;Warm up new domains gradually, starting at 20-50 emails per day and scaling over 4-6 weeks&lt;/li&gt;
&lt;li&gt;Remove unengaged contacts regularly before complaint rates climb&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Checking your deliverability setup before it becomes a problem is much easier than recovering from a blacklisting. &lt;a href="https://inboxgreen.email/check" rel="noopener noreferrer"&gt;InboxGreen's full domain check&lt;/a&gt; covers SPF, DKIM, DMARC, and blacklist status in one scan, no login required.&lt;/p&gt;

</description>
      <category>email</category>
      <category>webdev</category>
      <category>devops</category>
      <category>security</category>
    </item>
  </channel>
</rss>
