在while循环中发送电子邮件

问题描述:

当我尝试使用PHPMailer从while循环发送电子邮件时,它有时会向每个收件人发送2个邮件(有时候是3个副本)。在while循环中发送电子邮件

这是我的代码。你认为它有问题吗?

$list = $_POST['list']; 
    $items = rtrim($_POST['items'],","); 
    $query = "SELECT * FROM `mail` WHERE `ID` IN ($items)"; 
    $result = mysql_query($query); 
    $from = "[email protected]"; 
    $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变量,我的意思是发送$身体变量dublicated。

FIX:嘿,我完成了,我只是加了$body = "";,它现在完美了!

+4

你在数据库中的重复。 – David 2009-11-12 12:59:31

+0

我同意戴维。检查你的数据库。 – mauris 2009-11-12 13:02:00

+0

是的,我和大卫一起去。检查您的数据库 – sathish 2009-11-12 13:03:10

只需在您的查询中输入"SELECT DISTINCT",就不会再看到数据库问题。

+0

谢谢,但我检查它,它不是关于数据库dublicate,它是关于循环,我需要重置$ body变量我猜 – 2009-11-12 13:21:44

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

另外我很关心POST数组缺少验证(或者根本没有)。

可能是值得你在看这个:

cleaning $_POST variables

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