使用 phpmailer 循环发送个性化邮件时,若未在每次发送后清除收件人地址,会导致后续邮件不断累积前序收件人,最终所有收件人均收到全部邮件。解决关键是调用 `clearaddresses()` 或 `clearallrecipients()` 重置收件人列表。
在 PHPMailer 中,addAddress()、addCC() 和 addBCC() 方法并不会自动覆盖已有收件人,而是累加到内部收件人列表中。因此,当在循环中重复调用 $mail->addAddress($mailAdres, $name) 而不清理时,第二次迭代会保留第一次的收件人,第三次又追加……最终所有邮件都发给了全部用户——这正是你遇到的“所有人收到所有人信息”的根本原因。
✅ 正确做法是在每次成功调用 $mail->send() 后,立即清除当前收件人配置:
foreach ($id as $mailId) {
$connect->connect('account where id=:id', array('id' => $mailId), '', 0);
$users = $connect->connect->fetch(PDO::FETCH_ASSOC);
$name = $users['name'];
$mailAdres = $users['mail'];
$mail_template = $name; // 实际项目中建议使用模板渲染,确保每封邮件内容唯一
$mail->addAddress($mailAdres, $name);
$mail->isHTML(true);
$mail->CharSet = 'UTF-8';
$mail->Subject = $odemeType;
$mail->Body = $mail_template;
$mail->AltBody = '';
try {
$mail->send();
// ✅ 关键:仅清除 To 收件人(适用于未使用 CC/BCC 的场景)
$mail->clearAddresses();
// 若你同时使用了 addCC() 或 addBCC(),请改用:
// $mail->clearAllRecipients();
} catch (Exception $e) {
error_log("邮件发送失败(ID: {$mailId}): " . $mail->ErrorInfo);
continue; // 跳过当前用户,继续下一轮
}
}
⚠️ 注意事项: