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
2019-10-25 21:51:03 +08: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-03 05:20:58 +08:00
2019-10-25 21:51:03 +08: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-03 04:39:12 +08:00
2018-10-08 23:42:50 +08:00
Allowlist
2015-08-20 04:11:34 +08:00
=========
2018-10-08 23:42:50 +08:00
The file [allowlist.conf ](allowlist.conf ) gathers email domains that are often identified as disposable but in fact are not.
2015-08-20 04:11:34 +08:00
2022-08-13 06:51:29 +08:00
Contributing
============
Feel free to create PR with additions or request removal of some domain (with reasons).
2022-09-01 11:48:48 +08:00
**Specifically, please cite in your PR where one can generate a disposable email address which uses that domain, so the maintainers can verify it.**
2022-08-13 06:51:29 +08:00
Please add new disposable domains directly into [disposable_email_blocklist.conf ](disposable_email_blocklist.conf ) in the same format (only second level domains on new line without @), then run [maintain.sh ](maintain.sh ). The shell script will help you convert uppercase to lowercase, sort, remove duplicates and remove allowlisted domains.
Changelog
============
* 2/11/21 We created a github [org account ](https://github.com/disposable-email-domains ) and transferred the repository to it.
* 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!
* 12/6/16 - Available as [PyPI module ](https://pypi.org/project/disposable-email-domains ) thanks to [@di ](https://github.com/di )
* 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 )
2015-06-24 23:01:26 +08:00
Example Usage
=============
2022-08-13 06:59:07 +08:00
2024-04-20 06:45:06 +08:00
TOC: [Python ](#python ), [PHP ](#php ), [Go ](#go ), [Ruby on Rails ](#ruby-on-rails ), [NodeJS ](#nodejs ), [C# ](#c ), [bash ](#bash ), [Java ](#java )
2022-08-13 06:59:07 +08:00
### Python
2015-06-24 23:12:54 +08:00
```Python
2022-08-03 03:22:22 +08:00
with open('disposable_email_blocklist.conf') as blocklist:
blocklist_content = {line.rstrip() for line in blocklist.readlines()}
if email.partition('@')[2] in blocklist_content:
2015-06-24 23:12:54 +08:00
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 )
2018-03-01 07:13:46 +08:00
```python
2018-10-17 03:01:29 +08:00
>>> from disposable_email_domains import blocklist
2018-10-08 23:44:50 +08:00
>>> 'bearsarefuzzy.com' in blocklist
2016-12-06 23:07:48 +08:00
True
```
2022-08-13 06:59:07 +08: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 )
2018-07-11 09:53:04 +08:00
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 23:01:26 +08:00
```php
2018-10-08 23:42:50 +08: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 09:53:04 +08:00
$domain = mb_strtolower(explode('@', trim($email))[1]);
return in_array($domain, $disposable_domains);
2015-06-24 23:01:26 +08:00
}
```
2022-08-13 06:24:10 +08:00
2022-08-13 06:39:25 +08:00
Alternatively check out Composer package https://github.com/elliotjreed/disposable-emails-filter-php.
2022-08-13 06:59:07 +08:00
### Go
contributed by [@pjebs ](https://github.com/pjebs )
2022-08-13 06:24:10 +08:00
```go
import ("bufio"; "os"; "strings";)
var disposableList = make(map[string]struct{}, 3500)
func init() {
f, _ := os.Open("disposable_email_blocklist.conf")
for scanner := bufio.NewScanner(f); scanner.Scan(); {
disposableList[scanner.Text()] = struct{}{}
}
f.Close()
}
func isDisposableEmail(email string) (disposable bool) {
segs := strings.Split(email, "@")
_, disposable = disposableList[strings.ToLower(segs[len(segs)-1])]
return
}
```
2022-08-13 06:39:25 +08:00
Alternatively check out Go package https://github.com/rocketlaunchr/anti-disposable-email.
2022-08-13 06:24:10 +08:00
2022-08-13 06:59:07 +08:00
### Ruby on Rails
contributed by [@MitsunChieh ](https://github.com/MitsunChieh )
2016-11-29 14:39:54 +08:00
2021-05-21 00:30:51 +08:00
In the resource model, usually it is `user.rb` :
2016-11-29 14:39:54 +08:00
```Ruby
2018-10-08 23:42:50 +08:00
before_validation :reject_email_blocklist
2016-11-29 14:39:54 +08:00
2018-10-08 23:42:50 +08:00
def reject_email_blocklist
blocklist = File.read('config/disposable_email_blocklist.conf').split("\n")
2016-11-29 14:39:54 +08:00
2018-10-08 23:42:50 +08:00
if blocklist.include?(email.split('@')[1])
2016-11-29 14:39:54 +08:00
errors[:email] < < 'invalid email'
return false
else
return true
end
end
```
2021-05-21 00:30:51 +08:00
2023-06-17 02:30:22 +08:00
### Node.js
contributed by [@boywithkeyboard ](https://github.com/boywithkeyboard )
2017-07-12 03:19:32 +08:00
2023-06-17 02:30:22 +08:00
```js
import { readFile } from 'node:fs/promises'
2017-07-12 02:34:21 +08:00
2023-06-17 02:30:22 +08:00
let blocklist
2017-07-12 02:34:21 +08:00
2023-06-17 02:30:22 +08:00
async function isDisposable(email) {
if (!blocklist) {
const content = await readFile('disposable_email_blocklist.conf', { encoding: 'utf-8' })
2017-07-12 02:34:21 +08:00
2023-06-17 02:30:22 +08:00
blocklist = content.split('\r\n').slice(0, -1)
2017-07-12 03:19:32 +08:00
}
2023-06-17 02:30:22 +08:00
return blocklist.includes(email.split('@')[1])
}
2017-07-12 02:34:21 +08:00
```
2015-06-24 23:01:26 +08:00
2022-08-13 06:59:07 +08:00
### C#
2017-10-21 21:10:57 +08:00
```C#
2018-10-08 23:42:50 +08:00
private static readonly Lazy< HashSet < string > > _emailBlockList = new Lazy< HashSet < string > >(() =>
{
var lines = File.ReadLines("disposable_email_blocklist.conf")
2018-04-28 00:33:13 +08:00
.Where(line => !string.IsNullOrWhiteSpace(line) & & !line.TrimStart().StartsWith("//"));
return new HashSet< string > (lines, StringComparer.OrdinalIgnoreCase);
});
2018-10-08 23:42:50 +08:00
private static bool IsBlocklisted(string domain) => _emailBlockList.Value.Contains(domain);
2017-10-23 05:20:57 +08:00
2017-10-21 21:10:57 +08:00
...
var addr = new MailAddress(email);
2018-10-08 23:42:50 +08:00
if (IsBlocklisted(addr.Host)))
throw new ApplicationException("Email is blocklisted.");
2017-10-21 21:10:57 +08:00
```
2022-12-27 04:49:54 +08:00
### Bash
```
#!/bin/bash
# This script checks if an email address is temporary.
# Read blocklist file into a bash array
mapfile -t blocklist < disposable_email_blocklist.conf
# Check if email domain is in blocklist
if [[ " ${blocklist[@]} " =~ " ${email#*@} " ]]; then
message="Please enter your permanent email address."
return_value=false
else
return_value=true
fi
# Return result
echo "$return_value"
```
2024-02-06 02:05:14 +08:00
### Java
Code assumes that you have added `disposable_email_blocklist.conf` next to your class as classpath resource.
```Java
private static final Set< String > DISPOSABLE_EMAIL_DOMAINS;
static {
Set< String > domains = new HashSet< >();
try (BufferedReader in = new BufferedReader(
new InputStreamReader(
EMailChecker.class.getResourceAsStream("disposable_email_blocklist.conf"), StandardCharsets.UTF_8))) {
String line;
while ((line = in.readLine()) != null) {
line = line.trim();
if (line.isEmpty()) {
continue;
}
domains.add(line);
}
} catch (IOException ex) {
LOG.error("Failed to load list of disposable email domains.", ex);
}
DISPOSABLE_EMAIL_DOMAINS = domains;
}
public static boolean isDisposable(String email) throws AddressException {
InternetAddress contact = new InternetAddress(email);
return isDisposable(contact);
}
public static boolean isDisposable(InternetAddress contact) throws AddressException {
String address = contact.getAddress();
int domainSep = address.indexOf('@');
String domain = (domainSep >= 0) ? address.substring(domainSep + 1) : address;
return DISPOSABLE_EMAIL_DOMAINS.contains(domain);
}
```