2009-11-12 65 views
0

當我嘗試使用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

回答

1

只需在您的查詢中輸入"SELECT DISTINCT",就不會再看到數據庫問題。

+0

謝謝,但我檢查它,它不是關於數據庫dublicate,它是關於循環,我需要重置$ body變量我猜 – 2009-11-12 13:21:44

1

我認爲這可能是數據庫中重複的數據。

另外我很關心POST數組缺少驗證(或者根本沒有)。

可能是值得你在看這個:

cleaning $_POST variables

更新:雖然你可以使用該查詢DISTINCT我會質疑重複的是如何在第一時間到達那裏,看看,作爲一個單獨的問題。

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... 
}