Weave Code
Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Laravel Disposable Email Laravel Package

propaganistas/laravel-disposable-email

Laravel validator that rejects disposable email addresses from services like Mailinator and Guerillamail. Ships with a built-in blacklist (auto-updated weekly), a config file, the indisposable rule, and an optional command to refresh domains yourself.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

Architecture fit. This package is a narrowly scoped Laravel extension, not a platform: an auto-discovered service provider that registers an indisposable validation rule through callAfterResolving, a publishable config file, an artisan command (disposable:update), a bundled domains.json fallback, and a statically cached domain set. It introduces no new runtime, datastore, queue, schema, or network service. It composes into the existing validator pipeline as a single rule string — ['email', 'indisposable'] — which means it inherits form requests, API validation, localization, test helpers, and error-bag behavior for free. From a product-management standpoint this is the ideal shape for a guardrail control: it reduces throwaway-account signups, trial farming, and fake-review seeding without committing the team to a subsystem, an owner, or a migration. It should be positioned internally as hygiene, layered alongside — not instead of — email verification, rate limiting, captcha, and any fraud scoring already in place. It is not an identity or risk-scoring product and should not be sold to stakeholders as one.

Integration feasibility. Genuinely low effort. composer require propaganistas/laravel-disposable-email, an optional vendor:publish --tag=laravel-disposable-email, and applying the rule to selected form requests is a sub-day engineering task with no design review required. Two items are real product decisions rather than mechanical toggles:

  • List freshness ownership. The project ships weekly patch releases containing blacklist updates; the disposable:update command exists to decouple us from that cadence. Scheduling it is a mitigation, not a nice-to-have.
  • The :mx parameter. Enabling it puts a live DNS lookup on the signup validation hot path. That is a latency, availability, and false-positive tradeoff requiring an explicit fail-open/fail-closed decision and a timeout budget, signed off by whoever owns the signup funnel.

Technical risk. Concentrated in six areas:

  • List freshness vs. release cadence. Coverage decays silently if versions are pinned without bumping. The disposable:update command is the correct control; leaving it unscheduled converts a maintenance chore into a slow quality regression nobody notices until abuse metrics move.
  • Upstream list dependency. Detection quality is bounded entirely by the disposable/disposable blacklist. Rotating "front" domains — the documented web-library.net → mail.tm pattern — bypass a plain domain check. MX inspection narrows that gap but does not close it, and it can generate false positives where shared mail infrastructure serves legitimate senders.
  • Supply chain and maintainer concentration. 612 stars but 0 dependents in the index and a single-primary-maintainer history with no SLA or published security process. Acceptable as a utility dependency; not acceptable to treat as load-bearing infrastructure without a vendored fallback (the bundled domains.json is exactly that, which helps).
  • DNS on the hot path. indisposable:mx trades latency and resolver availability for coverage. A slow or failing resolver can degrade signup latency or, if errors are mishandled, reject valid users.
  • Cache interaction. The domain list is cached, and a Redis unserialize() defect was fixed in 2.1.16 — a reminder to verify serialization behavior against our cache driver rather than assume.
  • Support-window trimming. The project actively drops old majors (2.3.0 dropped Laravel 8/9 and PHP 8.0; later releases added Laravel 11, 12, and 13). This dependency must be on the framework-upgrade checklist or it becomes a blocker mid-upgrade.

Key questions for engineering before approval.

  1. Which flows enforce hard-block versus warn-only, and what is the user-facing recovery path (support contact, alternate domain guidance) when a legitimate user is caught?
  2. Do we schedule disposable:update daily, or accept weekly dependency bumps — and who owns that failure on-call?
  3. If we enable :mx: what timeout, are results cached per-domain, and on resolver error do we fail-open or fail-closed?
  4. Which cache store backs the domain list, and have we tested serialization against it (Redis/Memcached vs. file)?
  5. Do we need a custom fetcher via disposable-email.fetcher because of proxy or egress-restricted environments, or can the scheduler reach the source list directly?
  6. What is our measured false-positive rate in a shadow/warn-only pilot before we hard-block, and what threshold is acceptable to the growth team?
  7. Who reviews the list source itself if we add our own sources via the multi-source support added in 2.2.12?

Integration Approach

Stack fit. Native fit for any Laravel 11/12/13 application on PHP 8.1+. No framework shims, no event-bus gymnastics, no config-cache caveats beyond the standard config:cache workflow. It works in Lumen (config contract injected since 2.0.12). If our validation already flows through FormRequests and Validator::make, the rule appears with zero plumbing. If parts of the platform validate outside Laravel's validator (raw JS, third-party auth providers, queued webhook ingestion), those paths need separate handling — the package cannot protect what it does not see.

Migration path. Effectively a greenfield add rather than a migration; there is no prior state to unwind. A safe path:

  1. Install and publish config in a low-risk environment; confirm the service provider is discovered and the rule resolves (php artisan about / a smoke test).
  2. Deploy with the rule applied to new registration only, in warn-only mode — log the rejection, do not block — for two to four weeks to measure the false-positive rate and capture examples.
  3. Promote to hard-block on registration; leave account-recovery, password-reset, and existing-user email-change flows warn-only or unrestricted initially, since blocking a legitimate existing user from resetting their password is a support incident, not a fraud prevented.
  4. Extend enforcement to secondary surfaces (invites, guest checkout, contact/lead forms, review submission) one at a time.
  5. Evaluate :mx as a separate, later decision with its own pilot, not bundled into step 2.

Compatibility. Track the Laravel major support matrix explicitly — the package's own history shows majors dropped and added quickly (2.2.3 Laravel 10, 2.3.0 Laravel 11 with Laravel 8/9 and PHP 8.0 removed, 2.4.11 Laravel 12, 2.4.25 Laravel 13). Pin with a caret constraint (^2.5) and let minor/patch updates flow, because weekly patch releases are where the domain list ships. The package's own version numbers inflate quickly; do not read "2.4.x → 2.5.0" as a large change — 2.5.0 is a single feature (MX lookup).

Sequencing. Three tracks can run in parallel and should be scheduled against the release train:

  • Engineering: install, config, rule application per surface, feature flag for enforcement mode.
  • Platform/ops: schedule disposable:update on the app's existing scheduler; confirm the host has egress to the list source or configure a custom fetcher; verify cache-driver serialization in staging.
  • Product/support: define the blocked-user message (localized indisposable language line), the support macro for "I'm not a spammer," and the metrics we will watch post-launch.

Operational Impact

Maintenance. Low-but-nonzero, and the nonzero part is easy to forget. Ongoing obligations: (a) disposable:update scheduled — daily is the README's own recommendation and is the cheapest possible mitigation; (b) composer updates flowing so list-bearing patch releases land; (c) the dependency on the framework-upgrade checklist; (d) occasional review of false positives reported by support. Budget a small recurring allocation rather than treating this as fire-and-forget — the failure mode is silent decay, not a loud error.

Support. Support load is concentrated in one scenario: a real user with a legitimate email rejected at signup. That is a high-frustration, high-visibility ticket because it blocks the conversion funnel. Mitigations to have in place before enforcement: a clear, localized error message that names the reason; a documented exemption path (support agent can whitelist a domain or the account can be created manually); and warn-only telemetry that lets support tell "new false positive" from "known pattern." Growth and trust-and-safety teams are the two internal stakeholders who will generate the most questions; give them a dashboard rather than answering ad hoc.

Scaling. Negligible in the plain-list mode: a static, in-process set lookup. Effectively free at any realistic signup volume. The :mx mode changes the calculus — it is a per-validation DNS resolution on the signup path, so it scales with signup rate against an external resolver. At high volume this becomes a latency budget question (a slow resolver adds tail latency precisely to the flow where milliseconds matter) and a resolver-quota question. If :mx is enabled, add a short-TTL cache keyed on domain and a hard timeout well under the request timeout, and consider doing the MX check asynchronously as a post-signup flag rather than inline.

Failure modes to enumerate and pre-decide:

  • Stale list → coverage decays, abuse creeps back, no alert fires. Control: scheduled disposable:update plus a health check on its last-run timestamp.
  • Update command fails (egress blocked, source unreachable, proxy required) → list freezes at the bundled fallback. Control: alert on non-zero exit; configure disposable-email.fetcher if the environment needs it; the bundled domains.json is the safety net and should be understood as stale-but-present.
  • DNS failure with :mx enabled → slow or failed validation. Decision required: fail-open (accept the signup, flag for review) is almost always right for a hygiene control; fail-closed rejects real users and should be reserved for high-abuse surfaces only.
  • Cache corruption / serialization mismatch → rule errors out or silently no-ops. Control: staging validation against the production cache driver; a smoke test that asserts a known-disposable domain is rejected.
  • Framework upgrade breaks the rule → new validation path or dropped support. Control: the rule should have a test asserting a disposable domain fails and a normal domain passes, so a break is caught in CI rather than in production.

Ramp-up. For the team: near zero. One engineer reads a short README, one line in a FormRequest, one scheduler entry — a half-day including tests. The real ramp-up is organizational: support needs the escalation script, growth needs to accept the conversion tradeoff, and trust-and-safety needs to know what the control does and does not catch (rotating front domains, shared MX infrastructure). Plan a short written handoff and a post-launch review at 30 days against measured false positives and observed abuse reduction. Given the low integration cost, the correct framing is "cheap, reversible hygiene control with a measurable pilot" rather than a program — and the 0-dependents/adoption signal, while a reason to keep the bundled fallback in mind, does not justify a heavier governance process than that.

Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
coleus/frame
thtg88/journalism
filagora/filagora-ai-forums
rlacerda83/query-parser
socialdept/atp-orm
cboxdk/laravel-assistant-client
socialdept/atp-resolver
socialdept/tenant-domains
tautvydasr/blade-class-names
socialdept/color-scales
maherelgamil/controller
coleus/widgets
coleus/table
coleus/users
coleus/music
coleus/health
coleus/calendar
coleus/notes
coleus/support
coleus/settings