先说结论
Odoo CRM 里的 email_state 和 phone_state,本质上不是“客户质量评分”,而是联系方式可验证性提示。
源码逻辑非常朴素:
- 邮箱:先做
email_normalize_all(),再用mail_validate()看是否至少有一个候选邮箱合法; - 电话:结合国家码上下文,用
phone_parse()看号码能否被解析。
所以这两个字段回答的是:
- 这个联系方式看起来像不像一个有效格式;
而不是:
- 这个客户值不值得跟;
- 这个号码是否一定能打通;
- 这个邮箱是否一定有人收。
一、为什么 Odoo 先做标准化再做判断
邮箱字段常见问题很多:
- 大小写混杂;
- 一栏里写多个邮箱;
- 展示名带尖括号;
- 人工粘贴时夹杂空格。
所以 _compute_email_state() 不是直接正则硬判,而是先 email_normalize_all(),把可识别的邮箱候选拆出来,再逐个 mail_validate()。
这能显著减少“看起来脏、但其实能用”的误杀。
二、电话为什么离不开国家码
电话校验更麻烦。
同一串数字:
- 在中国看可能是手机号;
- 在别的国家可能长度就不对;
- 加不加区号,含义也不同。
所以 _compute_phone_state() 会从 lead 的 country_id.code 取国家上下文,再交给 phone_parse()。
这意味着:
Phone Quality 的结果,和国家字段并不是完全独立的。
国家填错,电话状态就可能跟着错。
三、为什么“incorrect”不等于这条线索没价值
最容易犯的业务错误,就是把格式提示当成商业判断。
例如:
- 邮箱写成群组地址或特殊格式,验证可能不通过;
- 电话缺国家码,解析失败;
- 但联系人其实是真客户。
所以 incorrect 更像:
- 需要清洗;
- 需要补国家/区号;
- 需要人工确认;
而不是“直接丢弃”。
四、为什么“correct”也不代表一定可联系
反过来也一样。
- 邮箱格式合法,不代表邮箱存在;
- 电话能解析,不代表电话有人接;
- 号码格式正确,不代表它属于当前这家公司。
Odoo 在这里做的是输入卫生,不是主数据真伪审计。
五、实务里最该怎么用这两个字段
更合理的用法是:
- 作为导入清洗提醒;
- 作为销售补资料优先级;
- 作为自动化分流前的基础校验;
- 结合国家、来源、活动再判断跟进价值。
最不合理的用法是:
- 直接拿
incorrect做丢弃规则。
六、排错顺序
联系方式质量看起来不对时,按这个顺序查:
- 邮箱是否包含多个地址、展示名或异常空格;
- 电话是否缺国家码;
country_id是否填错;- 是格式问题,还是你误把质量字段当商业评分。
一句话记忆
Odoo CRM 的邮箱/电话质量字段,只是在说“这串联系方式像不像合法输入”,不是在说“这条线索值不值得做”。
DISCUSSION
评论区