@devmehq/email-validator-js
Version:
Advanced Email Validation with DNS MX lookup and Mailbox Verification
110 lines (109 loc) • 4 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.domainPorts = void 0;
exports.isDisposableEmail = isDisposableEmail;
exports.isFreeEmail = isFreeEmail;
exports.verifyEmail = verifyEmail;
const smtp_1 = require("./smtp");
const dns_1 = require("./dns");
const validator_1 = require("./validator");
const psl_1 = require("psl");
let disposableEmailProviders;
const disposableResults = {};
let freeEmailProviders;
const freeResults = {};
function isDisposableEmail(emailOrDomain) {
let [_, emailDomain] = emailOrDomain === null || emailOrDomain === void 0 ? void 0 : emailOrDomain.split('@');
if (!emailDomain) {
emailDomain = _;
}
if (!emailDomain) {
return false;
}
// cache results
if (disposableResults[emailDomain])
return disposableResults[emailDomain];
if (!disposableEmailProviders) {
disposableEmailProviders = new Set(require('./disposable-email-providers.json'));
}
disposableResults[emailDomain] = emailDomain && disposableEmailProviders.has(emailDomain);
return disposableResults[emailDomain];
}
function isFreeEmail(emailOrDomain) {
let [_, emailDomain] = emailOrDomain === null || emailOrDomain === void 0 ? void 0 : emailOrDomain.split('@');
if (!emailDomain) {
emailDomain = _;
}
if (!emailDomain) {
return false;
}
// cache results
if (freeResults[emailDomain])
return freeResults[emailDomain];
if (!freeEmailProviders) {
freeEmailProviders = new Set(require('./free-email-providers.json'));
}
freeResults[emailDomain] = emailDomain && freeEmailProviders.has(emailDomain);
return freeResults[emailDomain];
}
exports.domainPorts = {
// 465 or 587
// https://help.ovhcloud.com/csm/en-ca-web-paas-development-email?id=kb_article_view&sysparm_article=KB0053893
'ovh.net': 465,
};
async function verifyEmail(params) {
const { emailAddress, timeout = 4000, verifyMx = false, verifySmtp = false, debug = false } = params;
const result = { validFormat: false, validMx: null, validSmtp: null };
const log = debug ? console.debug : (...args) => { };
let mxRecords;
if (!(0, validator_1.isValidEmail)(emailAddress)) {
log('[verifyEmail] Failed on wellFormed check');
return result;
}
const [local, domain] = emailAddress.split('@');
if (!domain) {
log('[verifyEmail] Failed on wellFormed check');
return result;
}
result.validFormat = true;
// save a DNS call
if (!verifyMx && !verifySmtp)
return result;
try {
mxRecords = await (0, dns_1.resolveMxRecords)(domain);
log('[verifyEmail] Found MX records', mxRecords);
}
catch (err) {
log('[verifyEmail] Failed to resolve MX records', err);
mxRecords = [];
}
if (verifyMx || verifySmtp) {
result.validMx = mxRecords && mxRecords.length > 0;
}
if (verifySmtp && !(mxRecords === null || mxRecords === void 0 ? void 0 : mxRecords.length)) {
result.validSmtp = false;
}
if (verifySmtp && (mxRecords === null || mxRecords === void 0 ? void 0 : mxRecords.length) > 0) {
// get custom port for domain if not provided in params
let domainPort = params.smtpPort;
if (!domainPort) {
const mxDomain = (0, psl_1.parse)(mxRecords[0]);
if ('domain' in mxDomain && mxDomain.domain) {
domainPort = exports.domainPorts[mxDomain.domain];
log(`[verifyEmail] Found mxDomain ${mxDomain.domain} with port ${domainPort}`);
}
if ('error' in mxDomain) {
log(`[verifyEmail] Failed to parse mxDomain ${mxDomain.error}`);
}
}
result.validSmtp = await (0, smtp_1.verifyMailboxSMTP)({
local,
domain,
mxRecords,
timeout,
debug,
port: domainPort,
});
}
return result;
}
;