给企业微信邮件群组写配置巡检器:API 探到底,撞上一道绕不开的墙
学校前阵出了档子事:一个学生误在企业微信邮箱里,把一封邮件发到了一个面向全校本科生的通知类群组(数万人量级)。收到的人随手点了个「回复全部」,大群二次雪崩,最终运维删了上百万封邮件。
根因很清晰,而且特别适合用程序兜——全是可量化、可枚举的配置失误:
- 可见性失控:通知类群组被设成”全员可搜索”,学生才能把它当普通联系人选出来;
- 发件无白名单:群组没限制发件人,任何成员都能直接发;
- 回复全部无约束:放大器,不是根因。
于是我想:能不能写个程序,定期读取邮件群组配置,按规则检查,发现问题就告警?
原型:能跑,但只是上半场
架构分三层:平台无关的规则引擎(把根因翻成 7 条规则)、数据适配层(API / 导出 CSV / 导出 JSON 三路)、报告+告警。用样例数据实测,原型能精准命中问题群组、对正常群组零误报。
到这儿一切顺利。但”能写程序”和”程序能读到数据”是两回事。
真去读数据:依次撞四道坎 + 一道墙
- 坎一:本机环境变量,沙箱读不到。 同事在终端
export的凭证,我这边的执行环境继承不到。改用「本机调一次gettoken把 token 写文件,我读文件」的方式解决,secret 不进聊天。 - 坎二:接口权限不在你找的菜单。
exmail接口权限不在「自建应用 → API 权限」那页,而在 协作 → 邮件 → 可调用接口的应用 里勾选,48002 立刻消失。 - 坎三:可信 IP 白名单。 运行机器出口 IP 不在应用的可信 IP 名单,报 60020。正解是把巡检脚本部署到白名单内的校园网服务器定时跑。
- 坎四:参数 schema 反直觉。
group/search是 GET,参数fuzzy是整型(0=全部,1=模糊),且要放 query 里。照文档改对后返回errcode 0。 - 那道绕不开的墙: 接口通了,却返回
count: 0。官方文档白纸黑字——「应用调用接口只能访问自身创建的邮件群组」。学校实际群组都是管理员在后台手工建的,不是 API 建的,所以 exmail API 永远查不到它们,返回 0 是写死的限额,没有任何后台配置能解除。
结论:用 API 审计「已存在的后台群组」这条路走不通。
但这次探查不是白费
- 数据源可达性,是自动化巡检的第一道坎。 能写规则引擎不等于能拿到数据,动手前先确认”数据怎么来”。
- 早用真数据验证,别只靠样例自嗨。 决定成败的是接真实数据源那一步。
- 诚实面对工具边界,敢于宣布死路。 API 查不到后台群组是接口设计底线,不是配置还能再调的——探查清楚后直接转向更省时间。
- 巡检只是兜底,真正的防线在更前面。 把规则嵌进”群组创建/修改”的审批流里实时拦截(shift-left),新群组默认受限,这才是根治。
- 替代路径一直都在:导出离线。 后台导出群组清单(CSV/JSON),离线跑同一套规则,零联网、零授权风险,对”已存在的群组”反而最稳。
给同类需求(邮件群组治理)的建议
按 ROI 排:① 先用「导出 + 离线巡检」立刻验证规则有效;② 再在创建/审批流里嵌实时校验,新群组默认受限——这才是根治;③ 若以后改用 API 来创建和管理群组,这次打通的接口和巡检器代码直接能用。