<?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: Matthew Michels</title>
    <description>The latest articles on DEV Community by Matthew Michels (@matthew_michels_2cfbda73e).</description>
    <link>https://dev.to/matthew_michels_2cfbda73e</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%2F3971999%2F0892da3b-cdd7-4488-ad2f-5970bca8c6cb.jpg</url>
      <title>DEV Community: Matthew Michels</title>
      <link>https://dev.to/matthew_michels_2cfbda73e</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/matthew_michels_2cfbda73e"/>
    <language>en</language>
    <item>
      <title>Block fake and typo emails at signup in about 15 lines</title>
      <dc:creator>Matthew Michels</dc:creator>
      <pubDate>Sun, 07 Jun 2026 02:56:29 +0000</pubDate>
      <link>https://dev.to/matthew_michels_2cfbda73e/block-fake-and-typo-emails-at-signup-in-about-15-lines-40hl</link>
      <guid>https://dev.to/matthew_michels_2cfbda73e/block-fake-and-typo-emails-at-signup-in-about-15-lines-40hl</guid>
      <description>&lt;p&gt;If you let any email into your database, you'll eventually pay for it. Typos, throwaway inboxes, dead domains. They bounce, they tank your sender reputation, and your real emails start landing in spam. Here's how I block them at signup.&lt;/p&gt;

&lt;h2&gt;
  
  
  The idea
&lt;/h2&gt;

&lt;p&gt;Check the address before you save it. Keep the good ones, recover typos, drop the junk.&lt;/p&gt;

&lt;h2&gt;
  
  
  The code (Node)
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const res = await fetch("&lt;a href="https://YOUR-RAPIDAPI-HOST/" rel="noopener noreferrer"&gt;https://YOUR-RAPIDAPI-HOST/&lt;/a&gt;", {&lt;br&gt;
  method: "POST",&lt;br&gt;
  headers: {&lt;br&gt;
    "Content-Type": "application/json",&lt;br&gt;
    "X-RapidAPI-Key": "YOUR_KEY",&lt;br&gt;
    "X-RapidAPI-Host": "YOUR-RAPIDAPI-HOST"&lt;br&gt;
  },&lt;br&gt;
  body: JSON.stringify({ email: req.body.email })&lt;br&gt;
});&lt;br&gt;
const r = await res.json();

&lt;p&gt;if (r.status === "invalid" &amp;amp;&amp;amp; r.did_you_mean) {&lt;br&gt;
  return reject(&lt;code&gt;Did you mean ${r.did_you_mean}?&lt;/code&gt;);   // recover the typo&lt;br&gt;
}&lt;br&gt;
if (r.status === "invalid" || r.checks.disposable) {&lt;br&gt;
  return reject("Please use a valid, non-disposable email.");&lt;br&gt;
}&lt;br&gt;
// r.status === "valid" -&amp;gt; save it&lt;br&gt;
&lt;/p&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  What comes back&lt;br&gt;
&lt;/h2&gt;

&lt;p&gt;A verdict (valid / invalid / risky), a 0-100 score, and a per-check breakdown: syntax, MX (dead domain), disposable, role-based, free-webmail, plus a &lt;code&gt;did_you_mean&lt;/code&gt; typo suggestion.&lt;/p&gt;

&lt;h2&gt;
  
  
  One honest caveat
&lt;/h2&gt;

&lt;p&gt;It doesn't do SMTP mailbox probing. That gets you blocked and hurts your sending IP, so it's left out and the response says &lt;code&gt;smtp_check: "skipped"&lt;/code&gt;. It still catches typos, fakes, dead domains and role inboxes, which is the bulk of bad signups.&lt;/p&gt;

&lt;p&gt;Free tier is 500/month if you want to try it: &lt;a href="https://www.detroitwebagent.com/email-verification-api" rel="noopener noreferrer"&gt;https://www.detroitwebagent.com/email-verification-api&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>api</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
