PHP code example of raul3k / disposable-email-blocker-core
1. Go to this page and download the library: Download raul3k/disposable-email-blocker-core library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
raul3k / disposable-email-blocker-core example snippets
use Raul3k\DisposableBlocker\Core\DisposableEmailChecker;
$checker = DisposableEmailChecker::create();
// Check if email is disposable
$checker->isDisposable('[email protected]'); // true
$checker->isDisposable('[email protected]'); // false
// Safe version (returns false for invalid emails instead of throwing)
$checker->isDisposableSafe('invalid-email'); // false
// Check domain directly
$checker->isDomainDisposable('tempmail.com'); // true
use Raul3k\DisposableBlocker\Core\DisposableEmailChecker;
use Raul3k\DisposableBlocker\Core\Checkers\{ChainChecker, FileChecker, PatternChecker};
// Combine file-based checking with pattern matching
$checker = DisposableEmailChecker::create(
new ChainChecker([
new FileChecker(__DIR__ . '/domains.txt'),
new PatternChecker(), // Uses default patterns
])
);
// Default patterns detect:
// - temp*, disposable*, throwaway*, fake*, junk*, spam*
// - 10minutemail, 5minmail, etc.
// - guerrillamail, yopmail, mailinator
// - Suspicious TLDs: .tk, .ml, .ga, .cf, .gq
// Add custom patterns
$patternChecker = new PatternChecker();
$patternChecker->addPattern('/^suspicious-/i');
use Raul3k\DisposableBlocker\Core\DisposableEmailChecker;
use Raul3k\DisposableBlocker\Core\Checkers\{FileChecker, WhitelistChecker};
$innerChecker = new FileChecker(__DIR__ . '/domains.txt');
$whitelistChecker = new WhitelistChecker($innerChecker, [
'company.com', // Allow company.com and all subdomains
'partner.org',
]);
$checker = DisposableEmailChecker::create($whitelistChecker);
// Even if mailinator.com is in the list, whitelist takes precedence
$whitelistChecker->addToWhitelist('special-case.mailinator.com');
// Check whitelist status
$whitelistChecker->isWhitelisted('company.com'); // true
$whitelistChecker->isWhitelisted('sub.company.com'); // true (parent is whitelisted)
use Raul3k\DisposableBlocker\Core\DisposableEmailChecker;
use Raul3k\DisposableBlocker\Core\Checkers\{FileChecker, CachedChecker};
use Raul3k\DisposableBlocker\Core\Cache\{ArrayCache, FileCache};
// In-memory cache (single request)
$cache = new ArrayCache();
// File-based cache (persistent)
$cache = new FileCache('/path/to/cache/dir');
// Wrap any checker with caching
$innerChecker = new FileChecker(__DIR__ . '/domains.txt');
$cachedChecker = new CachedChecker($innerChecker, $cache, ttl: 3600);
$checker = DisposableEmailChecker::create($cachedChecker);
use Raul3k\DisposableBlocker\Core\Cache\{Psr6Adapter, Psr16Adapter};
// PSR-16 (SimpleCache)
$cache = new Psr16Adapter($yourPsr16Cache);
// PSR-6 (CacheItemPool)
$cache = new Psr6Adapter($yourPsr6Pool);
$cachedChecker = new CachedChecker($innerChecker, $cache);
use Raul3k\DisposableBlocker\Core\DisposableEmailChecker;
use Raul3k\DisposableBlocker\Core\Checkers\CallbackChecker;
// Redis
$checker = DisposableEmailChecker::create(
new CallbackChecker(fn(string $domain) => $redis->sismember('disposable_domains', $domain))
);
// PDO
$stmt = $pdo->prepare('SELECT 1 FROM disposable_domains WHERE domain = ? LIMIT 1');
$checker = DisposableEmailChecker::create(
new CallbackChecker(function (string $domain) use ($stmt): bool {
$stmt->execute([$domain]);
return (bool) $stmt->fetchColumn();
})
);
// Eloquent (Laravel)
$checker = DisposableEmailChecker::create(
new CallbackChecker(fn(string $domain) => \App\Models\DisposableDomain::where('domain', $domain)->exists())
);
use Raul3k\DisposableBlocker\Core\Checkers\CheckerInterface;
class PdoDatabaseChecker implements CheckerInterface
{
private \PDOStatement $stmt;
public function __construct(\PDO $pdo, string $table = 'disposable_domains')
{
$this->stmt = $pdo->prepare(
sprintf('SELECT 1 FROM %s WHERE domain = ? LIMIT 1', $table)
);
}
public function isDomainDisposable(string $normalizedDomain): bool
{
$this->stmt->execute([$normalizedDomain]);
return (bool) $this->stmt->fetchColumn();
}
}
// Usage
$checker = DisposableEmailChecker::create(new PdoDatabaseChecker($pdo));
use Illuminate\Database\Eloquent\Model;
use Raul3k\DisposableBlocker\Core\Checkers\CheckerInterface;
class EloquentDatabaseChecker implements CheckerInterface
{
/** @var class-string<Model> */
private string $model;
/** @param class-string<Model> $model */
public function __construct(string $model = \App\Models\DisposableDomain::class)
{
$this->model = $model;
}
public function isDomainDisposable(string $normalizedDomain): bool
{
return $this->model::where('domain', $normalizedDomain)->exists();
}
}
// Usage
$checker = DisposableEmailChecker::create(new EloquentDatabaseChecker());
use Raul3k\DisposableBlocker\Core\DisposableEmailChecker;
use Raul3k\DisposableBlocker\Core\Checkers\FileChecker;
$checker = DisposableEmailChecker::create(
new FileChecker('/path/to/your/domains.txt')
);
use Raul3k\DisposableBlocker\Core\DisposableEmailChecker;
use Raul3k\DisposableBlocker\Core\Checkers\{ChainChecker, FileChecker, PatternChecker, CallbackChecker};
$checker = DisposableEmailChecker::create(
new ChainChecker([
new FileChecker('/path/to/domains.txt'),
new PatternChecker(),
new CallbackChecker(fn($domain) => $redis->sismember('extra_domains', $domain)),
])
);
// After checking, you can see which checker matched
$result = $checker->check('[email protected]');
$result->getMatchedChecker(); // 'Raul3k\DisposableBlocker\Core\Checkers\PatternChecker'
use Raul3k\DisposableBlocker\Core\Sources\SourceRegistry;
$registry = new SourceRegistry();
// List available sources
$sources = $registry->list();
// ['disposable-email-domains', 'burner-email-providers', 'mailchecker', ...]
// Fetch domains from a source
$source = $registry->get('disposable-email-domains');
foreach ($source->fetch() as $domain) {
echo $domain . "\n";
}
use Raul3k\DisposableBlocker\Core\Sources\{SourceRegistry, UrlSource, FileSource};
use Raul3k\DisposableBlocker\Core\Parsers\{TextLineParser, JsonArrayParser};
$registry = new SourceRegistry();
// Remote text file (one domain per line)
$registry->register(new UrlSource(
url: 'https://example.com/domains.txt',
name: 'my-text-source',
parser: new TextLineParser()
));
// Remote JSON array
$registry->register(new UrlSource(
url: 'https://example.com/domains.json',
name: 'my-json-source',
parser: new JsonArrayParser()
));
// JSON with nested path
$registry->register(new UrlSource(
url: 'https://api.example.com/data.json',
name: 'my-nested-json',
parser: new JsonArrayParser('response.data.domains')
));
// Local file
$registry->register(new FileSource(
path: '/path/to/local-domains.txt',
name: 'my-local-source'
));