wesbos/burner-email-providers
A maintained list of disposable and burner email domains for blocking throwaway signups. Drop it into validation rules or your own checks to reject temporary addresses, with a simple dataset you can filter, cache, or extend.
Architecture fit. This is not a PHP package. wesbos/burner-email-providers is a curated data repository — plain-text/JSON domain lists (free providers, disposable providers) published for consumption via npm. In a Laravel codebase it is therefore a data dependency, not a code dependency: there is no service provider, no facade, no ValidationRule, no Composer package. Fit is high for the underlying need (reject or flag disposable-email signups) and effectively zero as a drop-in library. The realistic integration is: vendor the list into our repo, wrap it in a Laravel validation rule we own.
Integration feasibility. Straightforward. A thin wrapper is roughly one to two engineering days including tests: parse the list into a set, normalize the domain (lowercase, strip trailing dot, handle IDN/punycode), match on the registrable domain plus subdomain suffix, and expose it as a ValidationRule. No new runtime services, no vendor lock-in. The metadata reinforces this reading — 1.2k stars signals community trust in the data, while 0 dependents and a low opportunity score reflect that there is no integration surface to build on.
Technical risk.
Key questions.
Bottom line: treat this as a seed dataset, not a dependency. Budget for the wrapper, the refresh job, and the policy decisions — those, not the list, are the actual work.
Stack fit. Laravel 9/10/11 on PHP 8.1+. Deliverables:
resources/data/ (or a private mirror), version-pinned and committed.DisposableEmail validation rule plus a domain-normalizer service.disposable_email_domains table for ops-managed allowlist/blocklist overrides layered on top of the vendored list.email-domains:sync) and scheduled job that fetches upstream, diffs against the current snapshot, and opens a PR or alerts rather than silently swapping data.Migration path. Greenfield, so sequencing is the migration: snapshot → rule → shadow telemetry → enforcement. Do not attempt to consume the npm package at runtime; take a tarball copy once and vendor the file.
Compatibility. The data format is the most stable interface here — newline-delimited domains survive upstream refactors better than JSON schema changes. Add a parser test that asserts minimum list size and format so a malformed upstream sync fails loudly instead of silently emptying the blocklist. Works identically in HTTP, queue workers, and console commands.
Sequencing.
| Phase | Scope | Exit criteria |
|---|---|---|
| 0 | Spike: inspect list contents, size, overlap with our existing users | Sample audited against real signup data; false-positive estimate |
| 1 | Vendored snapshot, rule, normalizer, unit tests | Rule green in CI; subdomain/IDN cases covered |
| 2 | Shadow mode: log would-be rejections, enforce nothing | 2 weeks of telemetry, false-positive rate quantified |
| 3 | Enforce on registration; allowlist override + CS runbook | Error rate flat, appeals process live |
| 4 | Automated refresh with diff review; optional internal mirror | Refresh owned by a named person |
Phase 2 is the gate. If shadow telemetry shows non-trivial false positives, revisit before any user is blocked.
Maintenance. Code churn is near zero; data maintenance is perpetual. The recurring cost is a scheduled sync plus human review of the diff — budget a few hours per quarter. Pin the snapshot and record its source commit so a rollback is one revert.
Support. Low ticket volume but high sensitivity: every blocked signup is a user who may not tell you. Requires a documented CS runbook (what the rejection means, how to allowlist a domain, how to escalate), and the rejection message should route to that path rather than a dead end.
Scaling. Negligible. A few thousand domains in a PHP set is sub-millisecond and a few hundred KB per worker. At 10x the list size it is still a non-issue. The only scaling concern is correctness of the cache invalidation when the list is refreshed on a running fleet — use a versioned cache key, not a blind Cache::forget.
Failure modes.
Ramp-up. A mid-level Laravel developer is productive in half a day; the wrapper is small and idiomatic. The genuine ramp-up is organizational: agreeing the matching policy, defining the allowlist owner, and getting CS comfortable with the rejection path. Plan for that time explicitly — it will exceed the engineering time.
How can I help you explore Laravel packages today?