当我尝试使用PHPMailer从while循环发送电子邮件时,它有时会向每个收件人发送2个,有时是同一个电子邮件的3个副本(它就像是随机的)。
这是我的代码。你认为它有问题吗?
$list = $_POST['list'];
$items = rtrim($_POST['items'],",");
$query = "SELECT * FROM `mail` WHERE `ID` IN ($items)";
$result = mysql_query($query);
$from = "donotreply@mysite.net";
$fromname = "mysite";
$mail = new PHPMailer(true);
$mail->IsSendmail();
$mail->From = $from;
$mail->FromName = $fromname;
$mail->Subject = "Your subscription was confirmed";
while ($row = mysql_fetch_array ($result))
{
// HTML body
$body .= "<p>Hi ". $row['name'] ." <br /><br />";
$body .= "Your subscription request to " . $l_name ."'s list was confirmed.<br /><br />";
$body .= "Thank You !<br /><br />";
// Plain text body (for mail clients that cannot read HTML)
$text_body = "To view the message, please use an HTML compatible email viewer!";
$mail->Body = $body;
$mail->AltBody = $text_body;
$mail->AddAddress($row['email']);
$mail->Send();
$mail->ClearAddresses();
}
您认为我应该将mail->send();
放在while循环中并从阵列中获取所有电子邮件吗?
或者您认为这是MySQL查询的问题吗?
编辑:我检查了数据库,没有关于数据库的问题,但我想通了(假设数组中有2封邮件)它正常发送第一封电子邮件,但第二封与dublicated $ body变量一起发送,我的意思是发送$ body变量出版。 FIX:嘿,我完成了,我刚刚添加了$body = "";
,现在它完美了!
答案 0 :(得分:1)
只需在查询中添加"SELECT DISTINCT"
,您就不会再看到数据库出现问题。
答案 1 :(得分:1)
我认为很可能是数据库中的重复数据。
此外,我担心POST阵列缺乏验证(或根本没有验证)。
值得你看看这个:
更新:虽然您可以在查询中使用DISTINCT,但我会首先询问重复项是如何到达的,并将其视为一个单独的问题。
答案 2 :(得分:0)
你在问题的最后提到了修复,但这就是为什么会产生影响:
.=
运算符附加到现有值,而=
覆盖它。在第一次迭代结束时和第二次迭代开始时,$body
包含电子邮件正文,在第二次迭代期间,您将附加到现有值。每次循环执行时,您都会在电子邮件的末尾添加另一个副本。正如您所说,设置$body = ""
会修复它,因为它会清空电子邮件的正文。
另一种解决方法是首次分配=
而不是.=
:
while ($row = mysql_fetch_array ($result))
{
// HTML body
$body = "<p>Hi ". $row['name'] ." <br /><br />"; // This line only has '='
$body .= "Your subscription request to " . $l_name ."'s list was confirmed.<br /><br />";
$body .= "Thank You !<br /><br />";
// etc...
}