emailsherlock/email-guard-bundle
Symfony bundle that blocks junk and disposable email addresses at form submit using local checks, before they reach your database. Optional EmailSherlock API key adds live MX and SMTP verification.
Email constraint, catching addresses that are syntactically valid but non-deliverable (disposable domains, reserved TLDs like .invalid, junk profiles). This directly affects signup form acceptance, activation rates, and downstream email deliverability metrics.block_on: ['invalid', 'disposable'] with review_on: [] lets you ship a soft policy first (block only the obvious junk, queue ambiguous cases for review) and tighten later without a rewrite. This is a configuration decision, not an engineering project.fail_open: true and timeout_ms: 800 are defaults that encode a product stance: never let a third-party verifier break your signup funnel. That is a deliberate trade of false-negative tolerance for uptime.Adopt when:
config/bundles.php, EmailType form option). On Laravel it does not drop in — the verify_email form option and constraint wiring are Symfony-specific. For a Laravel codebase, evaluate emailsherlock/email-guard-core-php directly and write a thin Laravel validation rule around it, or look elsewhere.Look elsewhere or defer when:
For executives: A small, low-risk integration that stops junk email addresses at the form, before they enter our CRM and sender reputation. Local checks are free, instantaneous, and require no vendor contract; live verification is opt-in via an API key. The default configuration fails open, so it cannot take down signup. Cost is near zero and the blast radius is a single form field.
For engineering: A Symfony bundle layering on emailsherlock/email-guard-core-php. Provides a VerifiedEmail constraint and a verify_email form option. Config is one YAML file; adding it to a field is one line. Local checks (syntax profile, reserved TLDs, ~73k disposable domains) run in-process with no network call; MX/SMTP probing is gated behind an optional API key with an 800ms timeout and fail-open default.
Honest caveats to state up front: The project is early — zero stars and zero dependents means we are the first real adopter and should expect to read the source and possibly pin a version. It is Symfony-only; if any of our surfaces are Laravel, we would need the underlying core package instead. And it is email quality, not abuse prevention — do not let it substitute for rate limiting or bot defenses.
How can I help you explore Laravel packages today?