2014-11-18 00:44:38 +08:00
List of disposable email domains
2014-09-03 04:31:28 +08:00
========================
2014-09-03 04:39:12 +08:00
2016-07-28 00:35:25 +08:00
[![Licensed under CC0 ](https://licensebuttons.net/p/zero/1.0/88x31.png )](https://creativecommons.org/publicdomain/zero/1.0/)
2016-07-28 00:31:43 +08:00
2015-08-20 04:21:20 +08:00
This repo contains a [list of disposable and temporary email address domains ](disposable_email_blacklist.conf ) often used to register dummy users in order to spam/abuse some services.
2014-09-03 05:20:58 +08:00
2015-03-06 06:50:15 +08:00
Originally collected to filter new user registration at https://usegalaxy.org and later merged with other lists found online. I cannot guarantee all of these can still be considered disposable but they probably were at one point in time.
2014-09-03 04:39:12 +08:00
2015-08-20 04:11:34 +08:00
Whitelist
=========
2015-08-20 04:13:21 +08:00
The file [whitelist.conf ](whitelist.conf ) gathers email domains that are often identified as disposable but in fact are not.
2015-08-20 04:11:34 +08:00
2015-06-24 23:01:26 +08:00
Example Usage
=============
2016-11-30 02:19:06 +08:00
**Python**
2015-06-24 23:12:54 +08:00
```Python
blacklist = ('disposable_email_blacklist.conf')
blacklist_content = [line.rstrip() for line in blacklist.readlines()]
if email.split('@')[1] in blacklist_content:
message = "Please enter your permanent email address."
return (False, message)
else:
return True
```
2016-12-06 23:07:48 +08:00
2018-03-01 07:12:11 +08:00
Available as [PyPI module ](https://pypi.org/project/disposable-email-domains ) thanks to [@di ](https://github.com/di )
2016-12-06 23:07:48 +08:00
```
>>> from disposable_email_domains import blacklist
>>> 'bearsarefuzzy.com' in blacklist
True
```
2017-11-16 20:03:48 +08:00
**PHP** contributed by [@txt3rob ](https://github.com/txt3rob ), [@deguif ](https://github.com/deguif ) and [@pjebs ](https://github.com/pjebs )
2015-06-24 23:01:26 +08:00
```php
2017-11-16 20:03:48 +08:00
function is_disposable_email($email) {
$path = realpath(dirname(__FILE__)) . '/disposable_email_blacklist.conf';
$mail_domains_ko = file($path, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
$mail_domains_ko = array_fill_keys($mail_domains_ko, true);
$domain = mb_strtolower(explode('@', trim($email))[1])
return (isset($mail_domains_ko[$domain]) || array_key_exists($domain, $mail_domains_ko));
2015-06-24 23:01:26 +08:00
}
```
2018-03-01 07:07:04 +08:00
**Ruby on Rails** contributed by [@MitsunChieh ](https://github.com/MitsunChieh )
2016-11-29 14:39:54 +08:00
In resource model, usually it is `user.rb`
```Ruby
before_validation :reject_email_blacklist
def reject_email_blacklist
blacklist = File.read('config/disposable_email_blacklist.conf').split("\n")
if blacklist.include?(email.split('@')[1])
errors[:email] < < 'invalid email'
return false
else
return true
end
end
```
2018-03-01 07:07:04 +08:00
**NodeJs** contributed by [@martin-fogelman ](https://github.com/martin-fogelman )
2017-07-12 03:19:32 +08:00
2017-07-12 02:34:21 +08:00
```Node
'use strict';
const readline = require('readline'),
2017-07-12 03:19:32 +08:00
fs = require('fs');
2017-07-12 02:34:21 +08:00
const input = fs.createReadStream('./disposable_email_blacklist.conf'),
2017-07-12 03:19:32 +08:00
output = [],
rl = readline.createInterface({input});
2017-07-12 02:34:21 +08:00
// PROCESS LINES
rl.on('line', (line) => {
2017-07-12 03:19:32 +08:00
console.log(`Processing line ${output.length}`);
output.push(line);
2017-07-12 02:34:21 +08:00
});
// SAVE AS JSON
rl.on('close', () => {
2017-07-12 03:19:32 +08:00
try {
2017-07-12 03:20:00 +08:00
const json = JSON.stringify(output);
fs.writeFile('disposable_email_blacklist.json', json, () => console.log('--- FINISHED ---'));
2017-07-12 03:19:32 +08:00
} catch (e) {
console.log(e);
}
2017-07-12 02:34:21 +08:00
});
```
2015-06-24 23:01:26 +08:00
2017-10-21 21:10:57 +08:00
**C#**
```C#
private static readonly Lazy< HashSet < string > > _emailBlackList =
new Lazy< HashSet < string > >(
() =>
{
var result = new HashSet< string > (StringComparer.OrdinalIgnoreCase);
using (var reader = new StreamReader("disposable_email_blacklist.conf"))
{
string line;
while ((line = reader.ReadLine()) != null)
if (!string.IsNullOrWhiteSpace(line) & & !line.TrimStart().StartsWith("//"))
result.Add(line);
}
return result;
});
2017-10-23 05:20:57 +08:00
private static bool IsBlacklisted(string domain)
{
var parts = domain.Split('.');
var len = parts.Length;
return
len == 1 & & _emailBlackList.Value.Contains(domain)
|| _emailBlackList.Value.Contains($"{parts[len - 2]}.{parts[len - 1]}")
|| len > 2 & & _emailBlackList.Value.Contains($"{parts[len - 3]}.{parts[len - 2]}.{parts[len - 1]}");
}
2017-10-21 21:10:57 +08:00
...
var addr = new MailAddress(email);
2017-10-23 05:20:57 +08:00
if (IsBlacklisted(addr.Host)))
2017-10-21 21:10:57 +08:00
throw new ApplicationException("Email is blacklisted.");
```
2014-11-18 00:44:38 +08:00
Contributing
============
2014-11-18 00:46:07 +08:00
Feel free to create PR with additions or request removal of some domain (with reasons).
2014-09-17 12:16:45 +08:00
Use
2015-08-20 04:07:27 +08:00
`$ cat disposable_email_blacklist.conf your_file | tr '[:upper:]' '[:lower:]' | sort -f | uniq -i > new_file.conf`
`$ comm -23 new_file.conf whitelist.conf > disposable_email_blacklist.conf`
2014-09-17 12:16:45 +08:00
2016-07-28 00:01:26 +08:00
to add contents of another file in the same format (only second level domains on new line without @). It also converts uppercase to lowercase, sorts, removes duplicates and removes whitelisted domains.
2016-07-28 00:07:25 +08:00
Changelog
============
2016-12-06 23:07:48 +08:00
2017-08-19 04:16:57 +08:00
* 7/31/17 @deguif [joined ](https://github.com/martenson/disposable-email-domains/issues/106 ) as a core maintainer of this project. Thanks!
2018-03-01 07:12:11 +08:00
* 12/6/16 - Available as [PyPI module ](https://pypi.org/project/disposable-email-domains ) thanks to [@di ](https://github.com/di )
2016-12-06 23:10:57 +08:00
* 7/27/16 - Converted all domains to the second level. This means that starting from [this commit ](https://github.com/martenson/disposable-email-domains/commit/61ae67aacdab0b19098de2e13069d7c35b74017a ) the implementers should take care of matching the second level domain names properly i.e. `@xxx.yyy.zzz` should match `yyy.zzz` in blacklist more info in [#46 ](https://github.com/martenson/disposable-email-domains/issues/46 )