Skip to content

Cloud sign-up refuses disposable email addresses - #897

Merged
keysersoft merged 1 commit into
mainfrom
keysersoft/block-disposable-email
Oct 6, 2026
Merged

keysersoft merged 1 commit into
mainfrom
keysersoft/block-disposable-email

Conversation

@keysersoft

Copy link
Copy Markdown
Contributor

Why

The licence site grants one trial per email address, so a throwaway inbox buys a fresh 7-day trial every week. These sign-ups also add noise to the funnel numbers and to the drip/winback lists, and every reminder sent to a dead inbox costs sender reputation. Today the cloud has only 9 such accounts (none paid), so this is cheap hygiene rather than a fix for a large problem.

What

  • src/auth/disposable-email-domains.json: the disposable-email-domains blocklist (CC0, 9,205 domains, commit 1aac72a).
  • isDisposableEmail() matches the domain and any parent domain (a@inbox.yopmail.com is caught; notyopmail.com is not).
  • Cloud POST /api/auth/register answers 400 with "Please sign up with a permanent email address. Disposable email addresses are not accepted." The login page already shows the backend message as is.
  • The check runs before the address is looked up, on the domain alone, so the answer still reveals nothing about existing accounts.

Not affected

  • Forwarding services that deliver to a real inbox: Apple Hide My Email, SimpleLogin, Firefox Relay, DuckDuckGo. They are not on the list, and the tests pin this.
  • Self-hosted registration, invitations (they join an existing workspace and start no trial), SSO/SCIM provisioning, and existing accounts.

Tests

  • Unit: new disposable-email.util.spec.ts, plus cloud and self-hosted cases in auth.controller.spec.ts; src/auth 285/285; tsc and eslint clean.
  • nest build copies the JSON to dist/src/auth/. The compiled util was checked from dist.
  • Local HTTP run of the built backend in cloud mode on a throwaway DB: lala@yopmail.com, X@MAILINATOR.COM and a@inbox.yopmail.com got 400 and created no row. jane@gmail.com and abc@privaterelay.appleid.com got the usual neutral 201.

A throwaway inbox buys a fresh 7-day trial every week, since the licence
site grants one trial per address. Cloud registration now answers 400 for
domains on the CC0 disposable-email-domains list (9,205 domains, subdomains
included), before the address is looked up so the answer still says nothing
about existing accounts. Forwarding services that reach a real inbox (Apple
Hide My Email, SimpleLogin, Firefox Relay, DuckDuckGo) are not on the list.
Self-hosted, invitations and SSO are unchanged.
@keysersoft
keysersoft merged commit 35716d5 into main Oct 6, 2026
14 checks passed
@keysersoft
keysersoft deleted the keysersoft/block-disposable-email branch October 6, 2026 09:32
@github-actions github-actions Bot locked and limited conversation to collaborators Oct 6, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant