You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 11:27:56