注册接口收了 user@example.com 这种全角@地址,校验通过,发信时 SMTP 返回 501 5.1.3 Bad recipient address syntax。同一批还有 40 多个用中文句号结尾的地址。乍看像缓存或者权限的锅,追下去往往不是。

import re, unicodedata
addr = unicodedata.normalize("NFKC", raw).strip()
ok = re.fullmatch(r"[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}", addr)

追下去是这么回事:校验正则只判断有没有 @ 和点,没有限制字符集。全角符号在 Unicode 里是合法字符,但 SMTP 只接受 ASCII 的地址格式。校验通过后错误被推迟到发信阶段,用户已经看到注册成功。

碰到「邮箱地址校验」这类问题,我习惯先把当前配置原样备份一份,改坏了立刻换回来,不用现场推。测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。

线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。

具体做法是,先做 NFKC 归一化 把全角转成半角再校验;正则限制本地部分和域名允许的字符集;域名部分必须有至少一个点且不以点结尾;发信前再校一次 失败就当场提示用户。

验收就看一点,全角地址在注册时就被拒并提示格式错误,发信日志里不再出现 501,合法地址仍能正常注册。

作者 9823189