如何解决PHPMailer无法发送超过16个收件人的问题?
解决PHPMailer发送超过16个收件人报错的问题
这个报错cannot send more than 16 receipts using php mailer本质不是PHPMailer本身的限制——PHPMailer并没有硬限制单封邮件的收件人数,问题出在你使用的邮件服务器(或者PHP内置mail()函数对应的底层配置)设置了单封邮件最多16个收件人的上限,PHPMailer只是把服务器的限制反馈给了你。
下面给你几个可行的解决办法:
1. 改用密送(BCC)发送
很多邮件服务器对To字段的收件人数限制比较严格,但对密送(BCC)的限制会宽松一些,而且收件人看不到彼此的邮箱地址,更符合隐私要求。只需要把你代码里的AddAddress改成AddBCC即可:
if ($redirectemail == "") { $mail->Body = $body; $emailListArr = preg_split("/[;,]/", $toemail); // 过滤无效/空邮箱(可选但推荐) $emailListArr = array_filter($emailListArr, function($email) { $cleanEmail = trim($email); return !empty($cleanEmail) && filter_var($cleanEmail, FILTER_VALIDATE_EMAIL); }); foreach ($emailListArr as $emailAdd) { $mail->AddBCC(trim($emailAdd)); // 替换成AddBCC } }
2. 分批发送邮件
如果密送也有数量限制,或者你必须用To字段发送,那就把收件人列表分成小批量,每批发送一封邮件。比如每15个收件人一组(留一点余量避免触达限制):
if ($redirectemail == "") { $emailListArr = preg_split("/[;,]/", $toemail); // 过滤无效/空邮箱 $emailListArr = array_filter($emailListArr, function($email) { $cleanEmail = trim($email); return !empty($cleanEmail) && filter_var($cleanEmail, FILTER_VALIDATE_EMAIL); }); $batchSize = 15; // 每批收件人数,可根据服务器限制调整 $batches = array_chunk($emailListArr, $batchSize); foreach ($batches as $batch) { // 每次新建PHPMailer实例(或者重置之前的实例的收件人) $mail = new PHPMailer(true); // 重新配置邮件基础信息(发件人、主题、正文、SMTP服务器等) $mail->isSMTP(); // 如果你用SMTP,否则用对应的发送方式 $mail->Host = 'your-smtp-server.com'; $mail->SMTPAuth = true; $mail->Username = 'your-email@example.com'; $mail->Password = 'your-password'; $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; $mail->Port = 587; $mail->setFrom('your-email@example.com', 'Your Name'); $mail->Subject = 'Your Email Subject'; $mail->Body = $body; // 添加当前批次的收件人 foreach ($batch as $emailAdd) { $mail->AddAddress(trim($emailAdd)); } // 发送并处理错误 try { $mail->send(); echo "批次邮件发送成功\n"; } catch (Exception $e) { echo "批次邮件发送失败: {$mail->ErrorInfo}\n"; } // 加个短延时,避免触发服务器的发送频率限制 sleep(2); } }
3. 调整邮件服务器配置(仅适用于自有服务器)
如果你用的是自己搭建的邮件服务器(比如Postfix、Sendmail),可以直接修改服务器的收件人数量限制:
- Postfix:找到主配置文件
main.cf,修改smtp_recipient_limit参数(默认可能是16),比如改成smtp_recipient_limit = 100,然后重启Postfix服务。 - Sendmail:修改配置文件中的
MaxRecipients选项,调整为你需要的数值,重启Sendmail即可。
注意:如果是第三方邮件服务商(比如Gmail、腾讯企业邮等),这个限制是服务商设定的,你无法修改,只能用前两种方法。
内容的提问来源于stack exchange,提问作者Haymar Hlaing
相关产品推荐
相关产品推荐

