erag/laravel-disposable-email
Laravel package for detecting and blocking disposable email addresses. It provides a validation rule and helpers to reject throwaway domains using a configurable domain list, making it easy to keep registration, forms, and APIs free of temporary email signups.
Architecture fit
disposable_email), an explicit rule object, a facade (Disposable), and a Blade conditional (@disposableEmail). This maps cleanly onto the framework's existing validation and view layers, so there is no custom request pipeline or middleware to own.config/disposable-email.php) with sensible defaults means a team can adopt it without writing wrapper code. That is the main architectural selling point for a TPM: the integration is a validation rule, not a subsystem.Integration feasibility
composer require + php artisan erag:install-disposable-email), plus provider registration on Laravel 10. No migrations, no published assets beyond config, no env vars required.Disposable::email()), and view branching. A team should not need to fork or wrap it.Disposable::check() for structured results, custom .txt blacklist files, and a whitelist config for trusted domains.Technical risk
Email::domains() array is frozen at package release; runtime freshness depends on erag:sync-disposable-email-list pulling from a raw GitHub URL. That is a single point of both failure and trust.raw.githubusercontent.com gives no signature, checksum, or pinning. A compromised or malformed upstream list becomes an application-level denial-of-signup vector. This is the highest-severity risk for a TPM to flag.block_subdomains: true) compounds this by widening the blast radius of a single bad parent entry.disposable_email:dns can add latency and a new timeout failure mode; this should be treated as an opt-in hardening step, not a default.Key questions
Stack fit
Migration path
php artisan disposable:stats to baseline built-in vs. custom domain counts.whitelist from shadow-mode false positives, decide on block_subdomains, and enable cache_enabled with a TTL.erag:sync-disposable-email-list (daily is a reasonable default), with an alert on sync failure.Compatibility
config/app.php) and 11–13 (bootstrap/providers.php).storage/app may not survive redeploys unless persisted.Sequencing
remote_url at the mirror.Maintenance
.txt blacklist files need a change-control process.php artisan cache:clear (or targeted invalidation) must be part of the deploy runbook.Support
Disposable::check() plus disposable:stats gives enough detail (source(), matchedDomain(), whitelisted()) to answer "why was I blocked" without engineering involvement.Scaling
storage/app/blacklist_file or source it from config management.Failure modes
disposable:stats.Ramp-up
How can I help you explore Laravel packages today?