[英]Sending email in while loop
当我尝试使用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封邮件)它正常发送第一封电子邮件,但是第二封邮件带有$ body变量,这意味着它发送了$ body变量。
FIX:嘿,我完成了,我只添加了$body = "";
现在可以完美使用!
只需在查询中输入"SELECT DISTINCT"
就不会再出现数据库问题。
我认为很可能是数据库中的重复数据。
我也担心在POST数组上缺少验证(或根本没有验证)。
也许值得您关注一下:
更新:虽然您可以在查询上使用DISTINCT,但我会质疑重复项是如何首先到达那里的,并将其视为单独的问题。
您在问题的结尾提到了修复程序,但这就是为什么会有所不同的原因:
.=
运算符会附加到现有值上,而=
覆盖它。 在第一次迭代的末尾和第二次迭代的开始, $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...
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.