0

当我尝试使用 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 = "";它现在完美!

4

3 回答 3

1

只需"SELECT DISTINCT"在您的查询上加上一个,您就不会再看到您的数据库有问题。

于 2009-11-12T13:14:31.657 回答
1

我认为很可能是数据库中的重复数据。

我也担心 POST 数组上缺乏验证(或根本没有验证)。

可能值得你看看:

清理 $_POST 变量

更新:虽然您可以在查询中使用 DISTINCT,但我会质疑重复项是如何到达那里的,并将其视为一个单独的问题。

于 2009-11-12T13:15:00.860 回答
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...
}
于 2015-12-23T01:04:03.560 回答