propaganistas/laravel-disposable-email
Installation:
composer require propaganistas/laravel-disposable-email
The package auto-discovers its service provider—no manual registration needed.
Publish Config (optional but recommended for customization):
php artisan vendor:publish --tag=laravel-disposable-email
Config file: config/disposable-email.php.
First Use Case: Validate an email in a form request or controller:
use Propaganistas\LaravelDisposableEmail\Rules\DisposableEmail;
$request->validate([
'email' => ['required', 'email', new DisposableEmail],
]);
config/disposable-email.php (blacklist sources, cache settings).Propaganistas\LaravelDisposableEmail\Rules\DisposableEmail (for customization).tests/ (for edge cases like subdomains or dynamic domains).Form Validation:
// In a FormRequest or controller
$request->validate([
'email' => [new DisposableEmail],
]);
"The email field must not be a disposable email address."Dynamic Validation (e.g., API responses):
$validator = Validator::make($data, [
'email' => [new DisposableEmail],
]);
if ($validator->fails()) {
return response()->json(['error' => $validator->errors()]);
}
Customizing the Rule: Extend the rule for stricter/flexible checks:
use Propaganistas\LaravelDisposableEmail\Rules\DisposableEmail as BaseDisposableEmail;
class StrictDisposableEmail extends BaseDisposableEmail {
protected $blacklistSources = ['disposable', 'custom_source'];
}
'cache' => [
'enabled' => true,
'ttl' => 60 * 60, // 1 hour
],
$job = new ValidateDisposableEmail($email);
dispatch($job);
'validation' => [
'disposable_email' => 'This email is from a temporary service.',
],
False Positives:
mail.me) may be flagged. Use allowlist in config to whitelist them:
'allowlist' => ['mail.me', 'protonmail.com'],
'blacklist_sources' => [],
Dynamic Domains:
temp-mail.org may use subdomains (e.g., abc123.temp-mail.org). The package handles this by default, but test thoroughly.Rate Limits:
disposable/disposable API has rate limits. Cache aggressively or use a local mirror.Case Sensitivity:
$email = strtolower($email);
DisposableEmail rule:
protected function isDisposable($email) {
$result = parent::isDisposable($email);
\Log::debug("Disposable check for {$email}: " . ($result ? 'BLOCKED' : 'ALLOWED'));
return $result;
}
\Log::info(config('disposable-email.blacklist'));
Custom Blacklist Sources: Add a new source (e.g., a local file or API):
'blacklist_sources' => [
'disposable', // Default
'file://path/to/custom_blacklist.txt',
],
disposable, file://, https://.Pre/Post-Validation Hooks:
Override the rule’s passes() method:
public function passes($attribute, $value) {
if ($this->isDisposable($value)) {
$this->addCustomMessage('custom_reason');
}
return !$this->isDisposable($value);
}
Testing: Mock the blacklist in tests:
$this->app->instance('disposable-email.blacklist', ['test@example.com']);
How can I help you explore Laravel packages today?