Skip to content

Commit

Permalink
feat: add disable MX check param
Browse files Browse the repository at this point in the history
  • Loading branch information
jesselpalmer authored Apr 12, 2024
2 parents 599fde6 + 5325d43 commit d2b3ff3
Show file tree
Hide file tree
Showing 3 changed files with 56 additions and 25 deletions.
40 changes: 26 additions & 14 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,15 @@

# Node Email Verifier

Node Email Verifier is a email validation library for Node.js that checks if an
email address has a valid format and verifies the domain's MX (Mail Exchange)
Node Email Verifier is an email validation library for Node.js that checks if an
email address has a valid format and optionally verifies the domain's MX (Mail Exchange)
records to ensure it can receive emails.

## Features

- **RFC 5322 Format Validation**: Validates email addresses against the standard
email formatting rules.
- **MX Record Checking**: Verifies that the domain of the email address has
valid MX records indicating that it can receive emails.
- **RFC 5322 Format Validation**: Validates email addresses against the standard email formatting rules.
- **MX Record Checking**: Verifies that the domain of the email address has valid MX records indicating that it can receive emails. This check can be disabled using a parameter.


## Installation

Expand All @@ -24,36 +23,49 @@ npm install node-email-verifier --save

## Usage

Here's a simple example of how to use Node Email Verifier:
Here's how to use Node Email Verifier, with and without MX record checking:

```javascript
import emailValidator from 'node-email-verifier';

async function validateEmail(email) {
// Example with MX record checking
async function validateEmailWithMx(email) {
try {
const isValid = await emailValidator(email);
console.log(`Is "${email}" a valid email address?`, isValid);
console.log(`Is "${email}" a valid email address with MX checking?`, isValid);
} catch (error) {
console.error('Error validating email with MX checking:', error);
}
}

// Example without MX record checking
async function validateEmailWithoutMx(email) {
try {
const isValid = await emailValidator(email, false);
console.log(`Is "${email}" a valid email address without MX checking?`, isValid);
} catch (error) {
console.error('Error validating email:', error);
console.error('Error validating email without MX checking:', error);
}
}

validateEmail('[email protected]').then();
validateEmailWithMx('[email protected]').then();
validateEmailWithoutMx('[email protected]').then();
```

## API

### ```async emailValidator(email)```
### ```async emailValidator(email, checkMx = true)```

Validates the given email address.
Validates the given email address, with an option to skip MX record verification.

#### Parameters

- ```email``` (string): The email address to validate.
- ```checkMx``` (boolean): Whether to check for MX records, this defaults to true.

#### Returns

- ```Promise<boolean>```: A promise that resolves to true if the email address is valid, false otherwise.
- ```Promise<boolean>```: A promise that resolves to true if the email address is valid and, if checked, has MX records; false otherwise.

## Contributing

Expand Down
13 changes: 9 additions & 4 deletions src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -34,17 +34,22 @@ const checkMxRecords = async (email) => {

/**
* A sophisticated email validator that checks both the format of the email
* address and the existence of MX records for the domain.
* address and the existence of MX records for the domain, depending on the
* checkMx parameter.
*
* @param {string} email - The email address to validate.
* @param {boolean} checkMx - Determines whether to check for MX records.
* Defaults to true.
* @return {Promise<boolean>} - Promise that resolves to true if the email is
* valid, false otherwise.
*/
const emailValidator = async (email) => {
const emailValidator = async (email, checkMx = true) => {
if (!validateRfc5322(email)) return false;

const hasMxRecords = await checkMxRecords(email);
if (!hasMxRecords) return false;
if (checkMx) {
const hasMxRecords = await checkMxRecords(email);
if (!hasMxRecords) return false;
}

return true;
};
Expand Down
28 changes: 21 additions & 7 deletions test/index.test.js
Original file line number Diff line number Diff line change
@@ -1,15 +1,29 @@
import emailValidator from '../src/index.js';

describe('Email Validator', () => {
test('should validate correct email format', async () => {
expect(await emailValidator('[email protected]')).toBe(true);
});
// Testing with MX record check enabled
describe('with MX record check', () => {
test('should validate correct email format and MX record exists', async () => {
expect(await emailValidator('[email protected]')).toBe(true);
});

test('should reject incorrect email format', async () => {
expect(await emailValidator('invalid-email')).toBe(false);
test('should reject email from domain without MX records', async () => {
expect(await emailValidator('[email protected]')).toBe(false);
});
});

test('should reject email from domain without MX records', async () => {
expect(await emailValidator('[email protected]')).toBe(false);
// Testing without MX record check
describe('without MX record check', () => {
test('should validate correct email format regardless of MX records', async () => {
expect(await emailValidator('[email protected]', false)).toBe(true);
});

test('should reject incorrect email format regardless of MX records', async () => {
expect(await emailValidator('invalid-email', false)).toBe(false);
});

test('should validate email from domain without MX records', async () => {
expect(await emailValidator('[email protected]', false)).toBe(true);
});
});
});

0 comments on commit d2b3ff3

Please sign in to comment.