使用PHPMailer时,phpMyAdmin存储的邮件如何按5天分批发送并自动分配新邮件分组
原有静态分组思路的优化实现
你设计1-5值标记发送分组的思路本身完全可行,卡点仅在于新记录的自动赋值逻辑,不需要推翻重来:
- 给邮件表新增
send_status字段,设为tinyint(1)类型,默认值0,用于标记记录发送状态(0=待发送,1=已发送) - 借助MySQL触发器实现全自动赋值,无需在用户注册的业务代码中新增逻辑:
- 在phpMyAdmin中创建
BEFORE INSERT类型触发器,绑定到对应的邮件数据表 - 触发器执行逻辑固定为
SET NEW.send_group = 1,所有新插入的邮件地址会被自动归入第一发送组
- 在phpMyAdmin中创建
- 每日发信流程执行完成后,运行一次批量更新语句顺移剩余未发送记录的分组序号:
执行完成后,原第二组的未发送记录会自动归入第一组、第三组归入第二组,既保证每日固定发50封的节奏,也让所有新增的邮件地址始终排在第一优先级发送队列。UPDATE 你的邮件数据表名 SET send_group = send_group - 1 WHERE send_group > 1 AND send_status = 0
适配全自动化流程的全新无分组方案
如果不想维护静态分组字段、也不想每日跑顺移更新,可以直接用动态队列思路,从根源上减少需要维护的逻辑:
- 调整表结构,无需存储固定的1-5分组值,仅新增两个辅助字段:
queued_at:datetime类型,默认值设为CURRENT_TIMESTAMP,新记录插入时自动写入入库时间,无需手动赋值- 复用前述的
send_status字段标记发送状态
- 每日发信任务的取数逻辑不需要提前做分组拆分:
这段逻辑完全匹配你的需求:SELECT 邮件地址字段名 FROM 你的邮件数据表名 WHERE send_status = 0 ORDER BY queued_at DESC LIMIT 50- 每次固定取50条未发送记录,刚好匹配每日发信量要求
- 按入库时间倒序取数,最新注册的用户邮箱永远排在待发送队列最前面,无需额外操作就自动归入第一发送组
- 发信完成后,仅需将本次捞取的记录的
send_status更新为对应状态即可,无需对其他记录做任何调整。
落地注意事项
- 两种方案都需要给取数涉及的字段(如
send_group、send_status、queued_at)建立索引,避免后续数据量增长后取数拖慢数据库 - 发信逻辑需增加简单的并发判断,避免定时任务重复触发时,同一批未发送记录被重复捞取发送
内容的提问来源于stack exchange,提问作者user11021895
相关产品推荐
相关产品推荐

