UNPKG

@devmehq/email-validator-js

Version:

Advanced Email Validation with DNS MX lookup and Mailbox Verification

110 lines (109 loc) 4 kB
"use strict"; 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; }