2016-10-10 33 views
0

所以我用PHP這樣的多個用戶:PHP發送郵件從數據庫中選擇

if(isset($userID)) {  

$premium = $con->prepare(" 
SELECT Email 
FROM tblName as d  
WHERE Rank = $rank and Type = $type 
"); 
$premium->execute(); 

$premium->bind_result($email); 


} else { 
    echo "There is no User ID detected, try to refresh browser."; 
} 

while ($premium->fetch()) { 

    # SUBJECT (Subscribe/Remove) 
    $subject = "New Resume"; 

    # RESULT PAGE 
    $location = "http://www.website.com"; 

    $sender = "[email protected]"; 

    # MAIL BODY 
    $message = '<html><body>';  
    $message .= '<table rules="all" style="border-color: #666;" cellpadding="10">'; 
    $message .= "</table>"; 
    $message .= "</body></html>"; 

    $cc = "[email protected]om"; 
    $headers = "From: " . $sender . "\r\n"; 
    $headers = "BCC: " . $cc . "\r\n"; 
    $headers .= "Reply-To: ". strip_tags($_POST['Email']) . "\r\n"; 
    $headers .= "MIME-Version: 1.0\r\n"; 
    $headers .= "Content-Type: text/html; charset=ISO-8859-1\r\n"; 

    $to = $email; 

    mail($to, $subject, $message, $headers) or die ("Mail could not be sent."); 
} 
header("Location: http://website.com/"); 
die(); 

mysqli_close($link); 

但是對於每個選定的用戶來說,這不是發送電子郵件。我可以正確使用循環嗎?我應該使用foreach還是改進while循環?我怎麼能在這種情況下申請arrays?有人能以正確的方式得到我嗎?謝謝!

+1

您通過SQL內直接嵌入變量缺少'準備statements'點 - 使用佔位符和PDO分配變量uing'bind_param'在'mysqli'或'bindParam'。最初的'headers'用'$ headers =「BCC:」的第二行覆蓋。 $ cc。 「\ r \ n」;' – RamRaider

+0

您在代碼中有很多錯誤 – mohade

+0

@mohade感謝您的回覆,我想聽聽任何有關如何改進代碼的建議。 – Infinity

回答

0

我已經實現了這個使用foreach循環。

在使用foreach循環之前,將所有電子郵件地址保存在單個數組中,並遍歷數組以減少運行時間。

您可以通過迭代從數據庫獲取的全部數據來反過來。

您的選擇。

+0

謝謝你的回答,但我不知道如何正確使用數組。 – Infinity

+0

使用'$ emails = $ premium-> fetch_assoc()' –

+0

這不會覆蓋'bind_result($ email);'?我仍然需要'while($ premium-> fetch()){}'? – Infinity

0

你必須在這段時間使用fetch_assoc(),因爲如果你使用它,它將逐個獲取所有記錄,然後它將允許按照你需要的要求發送MAIL。

而且你必須串聯在第二行頭在這裏,因爲它會覆蓋報表

替換:

$headers = "From: " . $sender . "\r\n"; 
$headers = "BCC: " . $cc . "\r\n"; 

有:

$headers = "From: " . $sender . "\r\n"; 
$headers .= "BCC: " . $cc . "\r\n"; 
1

由於您正在使用BCC不使用循環發送郵件。 循環查詢結果在一次調用中收集所有收件人ID和發送郵件。

密件抄送:收到郵件的高級收件人的密件副本。主要和次要收件人不能看到第三個收件人。根據電子郵件軟件,第三級收件人只能在BCC中看到自己的電子郵件地址,或者他們可能會看到所有主要和次要收件人的電子郵件地址。

+0

感謝您的回覆,我不會在生產模式下使用BCC,我只是將它用於測試目的。 – Infinity

0

準備報表應採取佔位符的優勢,安全地執行

正如有人指出,在評論之前分配變量 - 如果分配每個收件人在BCC字段,你可以收集電子郵件地址的循環,但發循環後的電子郵件。這樣每個收件人將看到TO地址,但沒有其他收件人。

if(isset($userID, $rank, $type, $_POST['Email'])) { 

    /* create sql with placholders and prepare */ 
    $sql='select email from tblname where rank=? and type=?'; 
    $premium = $con->prepare($sql); 

    /* Only proceed if the prepared statement succeeded */ 
    if($premium){ 

     /* bind the variables to the placeholders and execute */ 
     $premium->bind_param('ss',$rank,$type); 
     $premium->execute(); 
     $premium->bind_result($email); 



     $to = "[email protected]"; 
     $bcc= array($to); 
     $subject = "New Resume"; 
     $location = "http://www.website.com"; 
     $sender = "[email protected]"; 

     /* collect all email addresses and add to BCC */ 
     while($premium->fetch()) { 
      $bcc[]=$email; 
     } 

     /* close the prepared statement */ 
     $premium->close(); 

     /* Close the db connection */ 
     $link->close(); 


     $message = ' 
     <html> 
      <body> 
       <table rules="all" style="border-color: #666;" cellpadding="10"></table> 
      </body> 
     </html>'; 

     $headers = "From: " . $sender . "\r\n"; 
     $headers .= "BCC: " . implode(',', $bcc) . "\r\n"; 
     $headers .= "Reply-To: ". strip_tags($_POST['Email']) . "\r\n"; 
     $headers .= "MIME-Version: 1.0\r\n"; 
     $headers .= "Content-Type: text/html; charset=ISO-8859-1\r\n"; 



     [email protected]($to, $subject, $message, $headers); 




     die(header("Location: " . ($status ? 'http://website.com/?mailsent=true' : 'http://website.com/?mailsent=false'))); 
    } 
} else { 
    echo "There is no User ID detected, try to refresh browser."; 
} 
相關問題