[英]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.