PHPMailer发送500封邮件仅发100封停止及批量发信方案咨询
问题1:代码仅能发送第一批邮件的原因分析
- 触发发送的逻辑错误:你的循环判断条件为
if ($i % 100 == 0),数组下标$i从0开始计数,首次满足条件时$i=0,仅添加了1个收件人就执行了发送并清空列表;后续要到$i=100、$i=200才会触发发送,和你预期的「每累计100个收件人发送一次」的逻辑不符。正确的判断条件应该是if(($i +1) % 100 == 0),这样刚好在添加完第100、200、300个收件人时触发发送。 - 缺少错误捕获和返回判断:PHPMailer的
send()方法执行失败时会返回布尔值false,如果开启异常模式则会抛出异常,你的代码没有做任何错误判断,也没有开启异常捕获,一旦某次发送失败(比如SMTP服务拒绝连接、触发发信限额),脚本就会直接终止运行,不会继续执行后续逻辑。建议初始化PHPMailer时传入true开启异常模式,用try catch包裹发送逻辑,通过$mail->ErrorInfo打印错误信息排查问题。 - Gmail SMTP本身的发信限制:普通个人Gmail账号的SMTP发信限额为每日500封,Google Workspace账号限额也仅为每日1000-2000封,同时还有短时间内的发送速率限制,触发限制后Gmail会临时拒绝你的SMTP请求,导致脚本终止。
- PHP运行环境限制:默认PHP的网页请求模式下
max_execution_time通常为30秒,发信是耗时操作,执行到时间阈值后脚本会被强制终止,不会继续运行。
问题2:8000封邮件的自建发信方案
- 基础配置要求
- 准备独立域名,配置好SPF、DKIM、DMARC三类DNS解析记录,提升发信信誉,降低进入垃圾邮件的概率。
- 使用持有固定公网IP的云服务器,提前确认IP未进入各大反垃圾邮件组织的黑名单,申请解封云服务商默认封禁的25端口。
- 邮件服务搭建
- 自建MTA服务,推荐使用轻量易配置的
Postfix作为发信服务端,规避第三方SMTP的限额问题。 - 搭配开源邮件群发系统(如phpList、OpenEMM),不要自己手写发信逻辑,这类开源系统已经内置了队列管理、速率控制、退信自动处理、订阅/退订管理等功能,能大幅降低进垃圾箱的概率,同时避免漏发、重复发送问题。
- 自建MTA服务,推荐使用轻量易配置的
- 发信优化规则
- 做IP预热:初期每天发送小批量邮件,逐步提升发信量,持续1-2周把IP信誉养起来,不要第一天就直接发8000封,否则很容易被接收方集体拉黑。
- 控制发信速率:每批发送50-100封,每批间隔30-60秒,不要短时间内发送大量请求。
- 定期清理收件人列表:及时移除退信、投诉、长期未打开邮件的无效地址,避免拉低发信域名和IP的信誉。
- 改用CLI模式执行发信脚本:不要通过网页请求触发发信,用PHP命令行模式运行或者搭配队列系统后台异步执行,不受网页执行时间、内存限制。
内容的提问来源于stack exchange,提问作者Founder Onepiecepower
相关产品推荐
相关产品推荐

