SELECT email FROM subscribers
WHERE status='confirmed' AND last_open_at > NOW() - INTERVAL 30 DAY
ORDER BY last_open_at DESC LIMIT 2000;

活动邮件群发完,打开率只有 6.2%,后台显示前 8000 个收件人里 3100 个是九十天没打开过的地址,新订阅的两千多人排在队列末尾,活动结束才发到。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。

追下去是这么回事:取名单的 SQL 只写了 ORDER BY created_at ASC 加 LIMIT 10000,先入库的老地址永远排在前面。服务商按批次计算信誉,前面的高退信把整批带下水。

这次卡住的地方就在「发送名单优先级」这一环,单独把它拎出来验证,别和其他改动混在同一次发布里。权限不要一口气开到最大,先加到够用再往上试,范围小才好收。

处理上按这个顺序:把最近三十天有打开记录的地址提到第一批,其余按最后活跃时间倒序;发送前排除连续三次硬退信的地址,别让它们占第一批配额;每批发完看一次退信率,超过 5% 就停下来清名单。

确认没问题再收工,第一批两千个地址的退信率降到 1% 以下,新订阅用户在活动当天收到邮件。

作者 9823189