在while循环中发送电子邮件

时间:2009-11-12 12:56:08

标签: php sendmail

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

3 个答案:

答案 0 :(得分:1)

只需在查询中添加"SELECT DISTINCT",您就不会再看到数据库出现问题。

答案 1 :(得分:1)

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

此外,我担心POST阵列缺乏验证(或根本没有验证)。

值得你看看这个:

cleaning $_POST variables

更新:虽然您可以在查询中使用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...
}