大约 8% 的营销邮件开头是「尊敬的 ,」,逗号前面空着,会员昵称为空的账号几乎全部命中。乍看像缓存或者权限的锅,追下去往往不是。

def greet(u):
    return (u.nickname or '').strip() or ('会员%s' % u.phone[-4:])
# 模板里只放 {{ greet }}

追下去是这么回事:称呼直接取昵称字段拼接,没有判空,昵称为空时拼出一个空字符串。模板里的兜底文案写在另一个分支,实际没走到。

「邮件称呼为空」相关的验证我通常做两遍,改完一次、隔天再看一次,确认不是临时生效。测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。

线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。日志级别临时调高可以,记得改回去,长期开着既占磁盘又掩盖真问题。

具体做法是,称呼统一走一个函数,空值时按手机号后四位或「会员」兜底;模板里不要写拼接逻辑,只接收已经处理好的完整称呼;用空昵称、纯空格昵称、英文昵称各测一次。

验收就看一点,空昵称账号收到的开头是「尊敬的会员8821」,不再出现空位。

作者 9823189