2016-09-20 53 views
0

我正在使用PHPMailer將表單中的電子郵件發送到MySQL數據庫中的所有電子郵件。在PHPMailer中使用數據庫中的電子郵件和名稱陣列

我已經設法讓表單發送電子郵件到每封電子郵件,但我現在試圖在發送給他們的電子郵件中使用他們的名字,這意味着每封電子郵件將以「你好,[他們的名字]開頭, 」。

我使用一個數組來遍歷我的數據庫查詢的結果,並添加每個電子郵件地址和名稱$mail->addAddress('[email protected], 'name');

我試過保存變量$name = $row['name'}; while循環中,但它從輸入姓氏將數據庫放入所有電子郵件中。

我的問題是:是否可以訪問該函數的'name'部分並使用它的每封電子郵件。還是從數據庫本身取名?如果是的話,我會怎麼做呢?

此外,當電子郵件發送給每個收件人時,它會顯示「收件人:」字段中的所有收件人。這對隱私來說很不好。有沒有辦法來防止這種情況?

我對PHP和MySQL相當陌生,所以仍然非常感謝。

請在下面找到我的代碼。

<?php 
 

 
// Take message value from form 
 
$message = preg_replace("/\r\n|\r/", "<br />", $_REQUEST['message']); 
 
$message = trim($message); 
 

 
// Error reporting on 
 
error_reporting(E_STRICT | E_ALL); 
 
date_default_timezone_set('Etc/UTC'); 
 

 
// Require PHPMailer 
 
require 'PHPMailer/PHPMailerAutoload.php'; 
 
$mail = new PHPMailer; 
 

 
$mail->isSMTP(); 
 
$mail->Host = 'smtp.example.com'; 
 
$mail->SMTPAuth = true; 
 
$mail->SMTPKeepAlive = true; // SMTP connection will not close after each email sent, reduces SMTP overhead 
 
$mail->Port = 587; 
 
$mail->Username = '[email protected]'; 
 
$mail->Password = 'mypassword'; 
 
$mail->setFrom('[email protected]', 'Me'); 
 
$mail->addReplyTo('[email protected]', 'Me'); 
 
$mail->Subject = "Newsletter"; 
 
    /* ----- Add address function below ----- */ 
 
// Require Database connection 
 
require 'dbcon.php'; 
 

 
// SELECT email and name values from database 
 
$query = "SELECT email, name FROM customers"; 
 

 
// Result = the database query 
 
$result = $con->query($query); 
 
// Get array of users email addresses and names. 
 
while($row = $result->fetch_array()) 
 
{ 
 
// Add recipients from values found in database 
 
$mail->addAddress($row["email"], $row["name"]); 
 
    
 
} 
 
    /* ----- Add address function above ----- */ 
 

 
$mail->Body ="Hello, <br> <br> $message"; 
 
$mail->AltBody = $message; 
 

 
if(!$mail->Send()) 
 
{ 
 
echo "Message could not be sent."; 
 
echo "Mailer Error: " . $mail->ErrorInfo; 
 
exit; 
 
} 
 

 
print 'Sent!'; 
 

 
?>

+2

目前您是通過所有的客戶循環並將每個地址添加到具有相同內容的一封電子郵件中,然後發送(不要這樣做 - 隱私問題)。而聽起來好像你想發送個人化的電子郵件給每個客戶。 – Progrock

+0

表單中的'$ message'對每個收件人都是一樣的。但是,是的,我想個性化每封電子郵件的第一行。 –

+0

你說得對@Progrock。除了Dave的回答,你真的幫助我了! –

回答

1

您正在設立發送一封電子郵件與多個收件人。爲了安全和禮節你應該解決電子郵件給自己(外循環):

$mail->addAddress('[email protected]', 'Me'); 

...然後添加所有收件人作爲BCC(內循環):

$mail->addBCC($row["email"], $row["name"]); 

至於名稱字段。在循環中添加一條調試線並查看您的輸出。名稱字段每次都是一樣的嗎?

print "Adding recipient: {$row['email']} {$row['name']}"; 

如果你要發送幾封電子郵件,一到每個收件人時,需要每次都實例化循環內一個新的電子郵件。

[更新]

如果你想發送一條消息給每個收件人,則每次(你的循環內)實例化一個新的電子郵件:

<?php 

// Take message value from form 
$message = preg_replace("/\r\n|\r/", "<br />", $_REQUEST['message']); 
$message = trim($message); 

// Error reporting on 
error_reporting(E_STRICT | E_ALL); 
date_default_timezone_set('Etc/UTC'); 

// Require PHPMailer 
require 'PHPMailer/PHPMailerAutoload.php'; 

// Require Database connection 
require 'dbcon.php'; 

// SELECT email and name values from database 
$query = "SELECT email, name FROM customers"; 

// Result = the database query 
$result = $con->query($query); 
// Get array of users email addresses and names. 
while($row = $result->fetch_array()) 
{ 

    // Instantiate a NEW email 
    $mail = new PHPMailer; 

    // Set the email settings 
    $mail->isSMTP(); 
    $mail->Host = 'smtp.example.com'; 
    $mail->SMTPAuth = true; 
    $mail->SMTPKeepAlive = true; // SMTP connection will not close after each email sent, reduces SMTP overhead 
    $mail->Port = 587; 
    $mail->Username = '[email protected]'; 
    $mail->Password = 'mypassword'; 
    $mail->setFrom('[email protected]', 'Me'); 

    $mail->addReplyTo('[email protected]', 'Me'); 
    $mail->Subject = "Newsletter"; 

    // Add recipient from values found in database 
    $mail->addAddress($row["email"], $row["name"]); 

    $mail->Body ="Hello, <br> <br> $message"; 
    $mail->AltBody = $message; 

    if(!$mail->Send()) 
    { 
    echo "Message could not be sent."; 
    echo "Mailer Error: " . $mail->ErrorInfo; 
    exit; 
    } 

    print "Sent mail to: {$row["email"]}, {$row["name"]}"; 

} 


?> 
+0

Upvote爲BCC部分,似乎已經解決了這個問題。我添加了調試行,但它只顯示了我的數據庫中的最後一封電子郵件,所以它仍然只保存最後一個值。 –

+0

剛剛看到您的更新。這工作!非常感謝。一切從隱藏其他收件人到在每封電子郵件中顯示他們的名字。就像我說的,我對PHP相當陌生,因此非常感謝這樣的循環結構提示! –

+0

不要每次創建一個新的實例,這是浪費資源,也會慢得多。 – Synchro

相關問題