如何在注册时拦截一次性邮箱
在注册表单上识别临时邮箱的三种方法,从静态黑名单到 API,附代码,以及会误伤真实用户的常见错误。
什么算一次性邮箱
一次性(或临时)地址来自无需注册即可提供收件箱的服务,通常只能用几分钟或几小时。Mailinator、Guerrilla Mail、10 Minute Mail 以及数以千计不太知名的域名都是这样。它们方便人们躲开邮件订阅,也同样方便那些批量注册账号的人。
有三类相近的地址常被混为一谈,它们需要不同的处理方式:
- 隐私中继,例如“通过 Apple 登录”的
privaterelay.appleid.com、DuckDuckGo 的duck.com或 Firefox Relay,会转发到一个真实且长期使用的收件箱。拦截它们会伤害注重隐私的客户。最多把它们当作一个小的风险信号。 - 免费邮箱服务商,如 Gmail、Outlook.com 或 Yahoo,并不是一次性的。它们的滥用模式不同:同一收件箱的别名,见我们的 Gmail 别名指南。
- 根本无法收信的域名——比如
gmial.com这样的拼写错误或编造的域名。这些也值得识别,因为没人能在那里确认账号。
方案一:在代码里放一份静态黑名单
GitHub 上有人维护开源的一次性域名名单,条目多达数万。最简单的做法是把名单载入一个集合,在注册时检查域名:
# Python DISPOSABLE = set(open("disposable_domains.txt").read().split()) def is_disposable(email: str) -> bool: domain = email.rsplit("@", 1)[-1].strip().lower().rstrip(".") parts = domain.split(".") # 子域名也要匹配:mail.tempdomain.com -> tempdomain.com return any(".".join(parts[i:]) in DISPOSABLE for i in range(len(parts) - 1))
它零成本、不增加延迟。缺点是:
- 会过时。新的一次性域名不断出现,很多服务还会专门轮换域名来绕过名单。半年前复制的名单缺少最新的那些——而它们恰恰是滥用者在用的。
- 名单之间不一致。不同名单收录不同域名,有些还有错误。合并多份覆盖更全,但维护更多。
- 需要一个更新任务,每次变化都要部署(或重新加载)。
方案二:检查邮件服务器(MX)
对域名的 MX 记录做一次 DNS 查询,就能知道它能否收信。这能识别任何名单都没有的拼写错误和编造域名:
# Python,使用 dnspython import dns.resolver def can_receive_mail(domain: str) -> bool: try: return len(dns.resolver.resolve(domain, "MX", lifetime=2)) > 0 except dns.resolver.NXDOMAIN: return False except Exception: return True # DNS 出问题不是用户的错:放行
按域名缓存结果,超时要短,而且绝不要因为你自己的 DNS 解析器一时出错就拒绝注册。注意,MX 检查识别不了一次性邮箱服务——它们收信完全正常,这正是它们的本职。
方案三:一个两者兼顾并自动保持更新的 API
API 把名单维护和 MX 查询从你的代码里移走。Attrelix 合并多份公开名单、每天更新、记录每个域名首次出现的日期、检查邮件服务器,并在同一次调用中规范化 Gmail 别名——同时还会评估网络和设备,所以每次注册你得到的是一个决定,而不只是对邮箱的判断。你可以在一次性邮箱检测工具里免费试用域名查询。
curl https://attrelix.com/v1/check \ -H "Authorization: Bearer $ATTRELIX_SECRET" \ -H "Content-Type: application/json" \ -d '{"email":"someone@mailinator.com","ip":"203.0.113.9"}'
响应包含 email.disposable、email.relay、email.mx 和规范化后的地址,以及整体决定和原因。
会误伤真实用户的错误
- 拦截中继。很多通过 Apple 登录的 iPhone 用户在用 Apple 的私密中继。拦截它就是拦截他们。
- 因 DNS 错误而拦截。超时并不能证明域名是假的。
- 名单过宽。一些社区名单收录了正规的小型服务商或公司域名。如果客户投诉,就把该域名加入白名单,而不是争辩。
- 没有出路的错误提示。“邮箱无效”会让输入了真实地址的真人一头雾水。直接说明不接受临时邮箱,并请对方换一个地址。
一次性邮箱检查抓不到什么
拦截一次性域名只会稍微提高滥用成本:滥用者会转向 Gmail。从那以后,滥用表现为一个邮箱或一台设备背后的大量账号。这时就该检测多账号出场了。
小结
- 区分一次性域名、隐私中继、免费邮箱服务商和失效域名。
- 静态名单是个好开始,但会过时;要么定期更新,要么用 API。
- 用 MX 检查识别失效域名,DNS 出问题时放行。
- 预料到滥用者会转向 Gmail 别名,并对地址做规范化。