@lacspace/email-validate
v1.2.0
Published
Smart email validation — syntax, disposable/temp-mail detection, role & free-provider flags, Gmail normalization and 'did you mean?' typo suggestions. Zero-dependency, isomorphic.
Maintainers
Readme
@lacspace/email-validate
Email validation that goes beyond a regex — disposable detection, typo suggestions, normalization.
A regex tells you an address is shaped right. This tells you it's a mailinator throwaway, that
gmial.comshould begmail.com, thatinfo@is a role mailbox, and gives you a normalized canonical form for de-duping users.
- ✅ Robust syntax + length checks (RFC-5321-ish)
- 🗑️ Disposable / temp-mail detection
- 💡 "Did you mean?" typo suggestions (
gmial.com→gmail.com) - 👥 Role-address (
info@,admin@) & free-provider flags - 🔤
normalizeEmail— Gmail dots/+tagsstripped, lowercased (great for de-dupe) - ⚡ Zero dependencies · 🌍 isomorphic · 📦 ESM + CJS · fully typed
New in 1.1.0 — a stronger, superset RFC-5322 syntax check (
isValidEmailRFC5322) that accepts quoted local parts and IP-literal domains; whole-addressisDisposableEmail()/isRoleAccount()wrappers; andnormalizeEmail(email, opts?)with per-rule toggles. All additive — every existing export is unchanged.
What's new in 1.2.0
- Control characters are rejected.
isValidEmail("[email protected]\n")used to returntruebecause the input was trimmed first. A CR, LF, tab or NUL is never part of an address, and a trailing one carried into a mail header is how header injection starts. Surrounding spaces are still trimmed. - Unicode domains are valid.
user@bücher.exampleanduser@例え.テストpass, checked in their ASCII (punycode) form.normalizeEmailmaps both spellings to the same key. New export:toAsciiDomain(domain). - Internationalised local parts are opt-in.
isValidEmail("mü[email protected]", { allowUnicodeLocal: true })accepts RFC 6531 addresses. It is off by default, because the whole mail path must support SMTPUTF8. The 64 limit counts octets. isFreeProviderknows the world's big providers: QQ, 163, 126, Naver, Daum, GMX, web.de, T-Online, Orange, Libero, Seznam, WP, Yahoo Japan, UOL, and more.
Install
npm install @lacspace/email-validate # or pnpm add / yarn add / bun addOne call, everything you need
import { validateEmail } from "@lacspace/email-validate";
validateEmail("[email protected]");
// {
// valid: true,
// normalized: "[email protected]",
// local: "john.doe+news",
// domain: "gmial.com",
// disposable: false,
// role: false,
// free: false,
// suggestion: "[email protected]" // ← typo caught
// }
validateEmail("[email protected]").disposable; // true
validateEmail("[email protected]").role; // true
validateEmail("nope@@bad").valid; // falseIndividual helpers
import {
isValidEmail, normalizeEmail, isDisposable, isRoleAddress, isFreeProvider, suggestEmail,
} from "@lacspace/email-validate";
isValidEmail("[email protected]"); // true
normalizeEmail("[email protected]"); // "[email protected]"
isDisposable("guerrillamail.com"); // true
isRoleAddress("support"); // true
isFreeProvider("yahoo.com"); // true
suggestEmail("[email protected]"); // "[email protected]"Real-world: clean a signup form
const r = validateEmail(input);
if (!r.valid) return fail("Please enter a valid email.");
if (r.suggestion) return confirm(`Did you mean ${r.suggestion}?`);
if (r.disposable) return fail("Please use a permanent email address.");
await createUser({ email: r.normalized }); // store the canonical formCustomize
validateEmail(input, {
extraDisposable: ["mycompany-temp.com"], // add your own throwaway domains
suggestions: false, // turn off typo suggestions
});You can also read/extend the exported sets: DISPOSABLE_DOMAINS, FREE_PROVIDERS, ROLE_LOCALS.
Advanced syntax & helpers (v1.1.0)
import {
isValidEmailRFC5322, isDisposableEmail, isRoleAccount, normalizeEmail,
} from "@lacspace/email-validate";
// Stronger RFC-5322 syntax — a SUPERSET of isValidEmail:
isValidEmailRFC5322('"john doe"@example.com'); // true (quoted local part)
isValidEmailRFC5322("user@[192.168.0.1]"); // true (IPv4 literal)
isValidEmailRFC5322("user@[IPv6:2001:db8::1]"); // true (IPv6 literal)
isValidEmailRFC5322("[email protected]"); // false (consecutive dots)
isValidEmailRFC5322("a".repeat(65) + "@x.com"); // false (local > 64)
// Whole-address convenience wrappers:
isDisposableEmail("[email protected]"); // true
isRoleAccount("[email protected]"); // true (ignores +tag)
// normalizeEmail now takes optional per-rule toggles (defaults = v1.0 behaviour):
normalizeEmail("[email protected]", { gmailRemoveDots: false }); // "[email protected]"
normalizeEmail("[email protected]", { removeSubaddress: false }); // "[email protected]"API
| Export | Signature | What it does |
| --- | --- | --- |
| isValidEmailRFC5322 | (email, opts?: { allowQuoted?; allowIpLiteral? }) → boolean | Stronger, superset syntax check: quoted local parts + IP-literal (IPv4/IPv6) domains, RFC length limits (local ≤64, domain ≤255, total ≤254), consecutive/edge-dot rejection. No network. |
| isDisposableEmail | (email, extra?: string[]) → boolean | Disposable check taking the whole address (companion to isDisposable(domain)). |
| isRoleAccount | (email) → boolean | Role-mailbox check taking the whole address, +tag-aware (companion to isRoleAddress(local)). |
| normalizeEmail | (email, opts?: NormalizeOptions) → string | Canonical form. New optional opts: gmailRemoveDots, gmailRemoveSubaddress, removeSubaddress, lowercaseLocal (all default true — v1.0 behaviour unchanged). |
The Lacspace MailKit
| Package | For |
| --- | --- |
| @lacspace/mailer | Send email over SMTP |
| @lacspace/email-templates | Build responsive HTML emails |
| @lacspace/email-validate | Validate & normalize addresses (this package) |
| @lacspace/email-verify | MX + SMTP deliverability checks |
Licensing
This package is free under the Lacspace Free Licence — permissive freedoms. Use it in personal and commercial projects at no cost; just keep the notice.
Not every Lacspace package is free. We also offer Commercial (paid), Client-specific, and Private (proprietary) packages under separate terms. See the full Lacspace Licence Centre.
The Lacspace Developer Platform
@lacspace/email-validate is part of 80+ zero-dependency, isomorphic TypeScript packages — one standard library for the modern web. Explore the ecosystem:
- 📦 This package, documented — https://developer.lacspace.com/packages/email-validate
- 🗂️ All 80+ packages — https://developer.lacspace.com/packages
- 🧭 Developer handbook — guides & runnable recipes — https://developer.lacspace.com/handbook
- 🧪 Live playground — run any package in your browser — https://developer.lacspace.com/playground
- 🖥️ Finished app templates — https://templates.lacspace.com
- 🚀 Scaffold a full app —
npm create lacspace-app@latest
Free under the Lacspace Free Licence — a permissive, free-to-use licence.
