Files

51 lines
1.1 KiB
Python
Raw Permalink Normal View History

2026-07-17 23:20:34 +02:00
"""Reserved localparts that may not be registered (SPEC §4/§6.1).
Mail-grade from day one: role addresses (RFC 2142) plus common admin/system
handles. Comparison is case-insensitive; keep entries lowercase.
"""
from __future__ import annotations
RESERVED_LOCALPARTS: frozenset[str] = frozenset(
{
# RFC 2142 role addresses
"postmaster",
"abuse",
"hostmaster",
"webmaster",
"usenet",
"news",
"www",
"uucp",
"ftp",
"noc",
"security",
"mailer-daemon",
# Common system/admin handles
"admin",
"administrator",
"root",
"noreply",
"no-reply",
"donotreply",
"do-not-reply",
"support",
"help",
"info",
"contact",
"sales",
"billing",
"system",
"daemon",
"nobody",
"null",
"void",
"test",
}
)
def is_reserved(localpart: str) -> bool:
"""Return True if ``localpart`` is reserved (case-insensitive)."""
return localpart.lower() in RESERVED_LOCALPARTS