Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,11 @@ domains directly by opening a pull request.

## Database

There are three key data files in this project:
There are four key data files in this project:

- [free.txt](https://github.com/willwhite/freemail/blob/master/data/free.txt) contains a list of domains that are known to provide free email service
- [disposable.txt](https://github.com/willwhite/freemail/blob/master/data/disposable.txt) contains a list of domains that are known to provide disposable email service
- [reserved.txt](https://github.com/willwhite/freemail/blob/master/data/reserved.txt) contains [IANA reserved and special-use domains](http://www.iana.org/domains/reserved) that should not be used for real email
- [blacklist.txt](https://github.com/willwhite/freemail/blob/master/data/blacklist.txt) contains a list of domains that this project will refuse to add to either list

Domains may only be a member of one list.
Expand Down Expand Up @@ -47,6 +48,10 @@ freemail.isDisposable('smith@gmail.com');
> false
freemail.isDisposable('jack@mailinater.com');
> true
freemail.isReserved('smith@example.com');
> true
freemail.isReserved('smith@gmail.com');
> false

```

Expand Down
10 changes: 10 additions & 0 deletions data/reserved.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
example
example.com
example.net
example.org
invalid
localhost
test
home.arpa
local
onion
13 changes: 12 additions & 1 deletion index.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ var tldjs = require('tldjs');

var disposable = fs.readFileSync(__dirname + '/data/disposable.txt').toString().split('\n');
var free = fs.readFileSync(__dirname + '/data/free.txt').toString().split('\n').concat(disposable);
var reserved = fs.readFileSync(__dirname + '/data/reserved.txt').toString().split('\n').filter(Boolean);

function isFree(email) {
if (typeof email !== 'string') throw new TypeError('email must be a string');
Expand All @@ -16,7 +17,17 @@ function isDisposable(email) {
return disposable.indexOf(domain) !== -1;
}

function isReserved(email) {
if (typeof email !== 'string') throw new TypeError('email must be a string');
var host = email.split('@').pop().toLowerCase();
// tldjs returns null for single-label hosts such as localhost, so fall back to the raw host.
var domain = tldjs.getDomain(host) || host;
if (reserved.indexOf(domain) !== -1) return true;
return reserved.indexOf(domain.split('.').pop()) !== -1;
}

module.exports = {
isFree: isFree,
isDisposable: isDisposable
isDisposable: isDisposable,
isReserved: isReserved
};
20 changes: 20 additions & 0 deletions test/test.js
Original file line number Diff line number Diff line change
Expand Up @@ -30,3 +30,23 @@ test('gmail.com should not be disposable', function(t) {
t.plan(1);
t.equal(freemail.isDisposable('smith@gmail.com'), false);
});

test('example.com should be reserved', function(t) {
t.plan(1);
t.equal(freemail.isReserved('smith@example.com'), true);
});

test('localhost should be reserved', function(t) {
t.plan(1);
t.equal(freemail.isReserved('localhost'), true);
});

test('foo.test should be reserved via reserved tld', function(t) {
t.plan(1);
t.equal(freemail.isReserved('smith@foo.test'), true);
});

test('gmail.com should not be reserved', function(t) {
t.plan(1);
t.equal(freemail.isReserved('smith@gmail.com'), false);
});