如何用PHP(PHPMailer)编写有效循环邮件脚本解决重复发送问题
解决PHPMailer循环发送邮件时重复收件的问题
我一眼就看出问题所在了——你在while循环里每次调用$mail->AddAddress(),但PHPMailer的这个方法是累加添加收件人的,不是替换。也就是说第一次循环给收件人A发邮件,第二次会同时发给A和B,第三次是A、B、C一起收……以此类推,自然前面的收件人会收到多封重复邮件。
具体修复方案
你需要在每次循环的开头(或末尾)重置PHPMailer的收件人列表,同时建议处理好其他可能的残留内容,比如附件。修改后的脚本片段如下:
include "phpmailer/classes/class.phpmailer.php"; $mail = new PHPMailer; $mail->IsSMTP(); $mail->SMTPSecure = 'ssl'; $mail->Host = "domain.com"; $mail->SMTPDebug = 2; $mail->Port = 465; $mail->SMTPAuth = true; $mail->Username = "no-reply@domain.com"; $mail->Password = "passsword"; $mail->SetFrom("no-reply@domain.com","No Reply"); $mail->Subject = $mail_subject; $query_email_list = mysqli_query($koneksi, "SELECT * FROM table"); while($data_email = mysqli_fetch_array($query_email_list)){ // 生成二维码 QRCode::png($data_email['email'], $tempdir. $data_email['email'].".png", $quality, $ukuran, $padding); // 处理邮件模板 $mail_body = file_get_contents('template/template_email_blast.html'); $mail_body = str_replace('{email}', $data_email['email'], $mail_body); $mail_body = str_replace('{nama_agent}', $data_email['agent_name'], $mail_body); $mail_body = str_replace('{tempat_duduk}', $data_email['meja'], $mail_body); // 关键操作:每次循环前清空所有收件人 $mail->clearAddresses(); // 如果用到了抄送/密送,也要同步清空 // $mail->clearCCs(); // $mail->clearBCCs(); // 添加当前单个收件人 $mail->AddAddress($data_email['email'], $data_email['agent_name']); // 设置邮件正文 $mail->MsgHTML($mail_body); // 发送邮件 $sent = $mail->Send(); // 可选优化:发送后删除临时二维码文件,避免占用服务器空间 unlink($tempdir. $data_email['email'].".png"); // 可选:添加失败日志,方便排查问题 if(!$sent) { error_log("发送邮件给".$data_email['email']."失败: ".$mail->ErrorInfo); } }
额外说明
clearAddresses()是PHPMailer专门用来清空收件人列表的方法,确保每次循环只有当前的单个收件人。- 如果你后续需要添加抄送或密送,记得也要调用对应的
clearCCs()和clearBCCs()方法,避免残留收件人。 - 临时生成的二维码文件建议发送后立即删除,不然2000个文件会白白占用服务器存储空间。
内容的提问来源于stack exchange,提问作者ujang7654321 ujang7654321
相关产品推荐
相关产品推荐

