使用PHPMailer addAddress()添加50+收件人未全送达,是否有数量限制?
PHPMailer addAddress() 无内置数量限制,问题出在这些地方
addAddress()方法本身没有收件人数量上限,你遇到的部分收件人收不到邮件,基本和这个方法无关,大概率是以下几个原因导致的:
邮件服务商的发送限制
几乎所有主流邮箱服务商(Gmail、Outlook、QQ/163邮箱等)都有单次发送的收件人数量限制,或者单日发送总量限制。比如Gmail免费版单次最多支持100个收件人,超过这个数的话,要么被服务商拦截,要么分批发送时部分批次失败。你需要去查自己发件邮箱的服务商规则,建议改成分批发送(比如每20个收件人发一次),避免触发限制。垃圾邮件过滤拦截
一次性给大量收件人发邮件,很容易被收件方的反垃圾系统判定为垃圾邮件,直接被扔进垃圾箱或者拦截。可以这么优化:- 邮件内容避免敏感营销关键词,尽量正式、有针对性
- 给收件人提供明确的退订链接(合规要求,也能降低垃圾邮件判定概率)
- 提前通知收件人将你的发件邮箱加入白名单
- 给发件域名配置DKIM、SPF、DMARC验证,提升邮件的可信度
代码逻辑的疏漏
如果你是循环添加收件人后一次性发送,或者分批发送时没清空收件人列表,可能会导致问题:- 如果你是一次性发给所有收件人:部分收件人邮箱无效(拼写错误、已注销)可能导致整个发送请求失败,或者服务商拒绝批量发送
- 如果你是逐个发送:一定要在每次发送后调用
clearAddresses()清空收件人,否则后续发送会累积之前的收件人,导致重复发送或者发送失败。示例代码:foreach ($userEmails as $email) { $mail->addAddress($email); if (!$mail->send()) { // 记录失败日志,方便排查 error_log("发送失败至 {$email}: " . $mail->ErrorInfo); } // 关键:清空收件人,避免下一次发送带上之前的地址 $mail->clearAddresses(); // 可选:清空附件、自定义头信息等,避免残留 $mail->clearAttachments(); $mail->clearCustomHeaders(); }
另外,一定要捕获发送失败的错误信息,很多时候收不到邮件是因为收件人邮箱本身无效,通过错误日志就能快速定位。
自建SMTP服务器的配置限制
如果用的是自己搭建的SMTP服务器(比如Postfix),可能在配置里设置了收件人数量上限,比如Postfix的smtp_recipient_limit参数,需要检查服务器的配置文件调整限制。
内容的提问来源于stack exchange,提问作者Daniel Lerma
相关产品推荐
相关产品推荐

