2014-11-17 17:44:38 +01:00
List of disposable email domains
2014-09-02 22:31:28 +02:00
========================
2014-09-02 22:39:12 +02:00
2016-07-27 18:35:25 +02:00
[![Licensed under CC0 ](https://licensebuttons.net/p/zero/1.0/88x31.png )](https://creativecommons.org/publicdomain/zero/1.0/)
2016-07-27 18:31:43 +02:00
2019-10-25 15:51:03 +02:00
This repo contains a [list of disposable and temporary email address domains ](disposable_email_blocklist.conf ) often used to register dummy users in order to spam or abuse some services.
2014-09-02 23:20:58 +02:00
2019-10-25 15:51:03 +02:00
We cannot guarantee all of these can still be considered disposable but we do basic checking so chances are they were disposable at one point in time.
2014-09-02 22:39:12 +02:00
2018-10-08 17:42:50 +02:00
Allowlist
2015-08-19 22:11:34 +02:00
=========
2018-10-08 17:42:50 +02:00
The file [allowlist.conf ](allowlist.conf ) gathers email domains that are often identified as disposable but in fact are not.
2015-08-19 22:11:34 +02:00
2015-06-24 17:01:26 +02:00
Example Usage
=============
2016-11-29 19:19:06 +01:00
**Python**
2015-06-24 17:12:54 +02:00
```Python
2018-10-08 17:42:50 +02:00
blocklist = ('disposable_email_blocklist.conf')
blocklist_content = [line.rstrip() for line in blocklist.readlines()]
if email.split('@')[1] in blocklist_content:
2015-06-24 17:12:54 +02:00
message = "Please enter your permanent email address."
return (False, message)
else:
return True
```
2016-12-06 16:07:48 +01:00
2018-03-01 00:12:11 +01:00
Available as [PyPI module ](https://pypi.org/project/disposable-email-domains ) thanks to [@di ](https://github.com/di )
2018-03-01 00:13:46 +01:00
```python
2018-10-16 21:01:29 +02:00
>>> from disposable_email_domains import blocklist
2018-10-08 17:44:50 +02:00
>>> 'bearsarefuzzy.com' in blocklist
2016-12-06 16:07:48 +01:00
True
```
2018-07-11 03:53:04 +02:00
**PHP** contributed by [@txt3rob ](https://github.com/txt3rob ), [@deguif ](https://github.com/deguif ), [@pjebs ](https://github.com/pjebs ) and [@Wruczek ](https://github.com/Wruczek )
1. Make sure the passed email is valid. You can check that with [filter_var ](https://secure.php.net/manual/en/function.filter-var.php )
2. Make sure you have the mbstring extension installed on your server
2015-06-24 17:01:26 +02:00
```php
2018-10-08 17:42:50 +02:00
function isDisposableEmail($email, $blocklist_path = null) {
if (!$blocklist_path) $blocklist_path = __DIR__ . '/disposable_email_blocklist.conf';
$disposable_domains = file($blocklist_path, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
2018-07-11 03:53:04 +02:00
$domain = mb_strtolower(explode('@', trim($email))[1]);
return in_array($domain, $disposable_domains);
2015-06-24 17:01:26 +02:00
}
```
2018-03-01 00:07:04 +01:00
**Ruby on Rails** contributed by [@MitsunChieh ](https://github.com/MitsunChieh )
2016-11-29 07:39:54 +01:00
In resource model, usually it is `user.rb`
```Ruby
2018-10-08 17:42:50 +02:00
before_validation :reject_email_blocklist
2016-11-29 07:39:54 +01:00
2018-10-08 17:42:50 +02:00
def reject_email_blocklist
blocklist = File.read('config/disposable_email_blocklist.conf').split("\n")
2016-11-29 07:39:54 +01:00
2018-10-08 17:42:50 +02:00
if blocklist.include?(email.split('@')[1])
2016-11-29 07:39:54 +01:00
errors[:email] < < 'invalid email'
return false
else
return true
end
end
```
2018-03-01 00:07:04 +01:00
**NodeJs** contributed by [@martin-fogelman ](https://github.com/martin-fogelman )
2017-07-11 21:19:32 +02:00
2017-07-11 20:34:21 +02:00
```Node
'use strict';
const readline = require('readline'),
2017-07-11 21:19:32 +02:00
fs = require('fs');
2017-07-11 20:34:21 +02:00
2018-10-08 17:42:50 +02:00
const input = fs.createReadStream('./disposable_email_blocklist.conf'),
2017-07-11 21:19:32 +02:00
output = [],
rl = readline.createInterface({input});
2017-07-11 20:34:21 +02:00
// PROCESS LINES
rl.on('line', (line) => {
2017-07-11 21:19:32 +02:00
console.log(`Processing line ${output.length}`);
output.push(line);
2017-07-11 20:34:21 +02:00
});
// SAVE AS JSON
rl.on('close', () => {
2017-07-11 21:19:32 +02:00
try {
2017-07-11 21:20:00 +02:00
const json = JSON.stringify(output);
2018-10-08 17:42:50 +02:00
fs.writeFile('disposable_email_blocklist.json', json, () => console.log('--- FINISHED ---'));
2017-07-11 21:19:32 +02:00
} catch (e) {
console.log(e);
}
2017-07-11 20:34:21 +02:00
});
```
2015-06-24 17:01:26 +02:00
2017-10-21 15:10:57 +02:00
**C#**
```C#
2018-10-08 17:42:50 +02:00
private static readonly Lazy< HashSet < string > > _emailBlockList = new Lazy< HashSet < string > >(() =>
{
var lines = File.ReadLines("disposable_email_blocklist.conf")
2018-04-27 18:33:13 +02:00
.Where(line => !string.IsNullOrWhiteSpace(line) & & !line.TrimStart().StartsWith("//"));
return new HashSet< string > (lines, StringComparer.OrdinalIgnoreCase);
});
2018-10-08 17:42:50 +02:00
private static bool IsBlocklisted(string domain) => _emailBlockList.Value.Contains(domain);
2017-10-22 23:20:57 +02:00
2017-10-21 15:10:57 +02:00
...
var addr = new MailAddress(email);
2018-10-08 17:42:50 +02:00
if (IsBlocklisted(addr.Host)))
throw new ApplicationException("Email is blocklisted.");
2017-10-21 15:10:57 +02:00
```
2014-11-17 17:44:38 +01:00
Contributing
============
2014-11-17 17:46:07 +01:00
Feel free to create PR with additions or request removal of some domain (with reasons).
2020-02-11 19:23:28 +01:00
Specifically, if adding more than one new domain, please cite in your PR where one can generate a disposable email address which uses that domain, so the maintainers can verify it.
Use:
2014-09-17 06:16:45 +02:00
2018-10-08 17:42:50 +02:00
`$ cat disposable_email_blocklist.conf your_file | tr '[:upper:]' '[:lower:]' | sort -f | uniq -i > new_file.conf`
2015-08-19 22:07:27 +02:00
2018-10-08 17:42:50 +02:00
`$ comm -23 new_file.conf allowlist.conf > disposable_email_blocklist.conf`
2014-09-17 06:16:45 +02:00
2018-10-08 17:42:50 +02: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 allowlisted domains.
2016-07-27 18:07:25 +02:00
Changelog
============
2016-12-06 16:07:48 +01:00
2019-05-24 20:46:27 +02:00
* 4/18/19 [@di ](https://github.com/di ) [joined ](https://github.com/martenson/disposable-email-domains/issues/205 ) as a core maintainer of this project. Thank you!
* 7/31/17 [@deguif ](https://github.com/deguif ) [joined ](https://github.com/martenson/disposable-email-domains/issues/106 ) as a core maintainer of this project. Thanks!
2017-08-18 22:16:57 +02:00
2018-03-01 00:12:11 +01: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 16:10:57 +01:00
2018-10-08 17:42:50 +02: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 blocklist more info in [#46 ](https://github.com/martenson/disposable-email-domains/issues/46 )