在PHPMailer

时间:2016-09-20 14:04:58

标签: php arrays phpmailer

我使用PHPMailer将表单中的电子邮件发送到MySQL数据库中的所有电子邮件。

我设法让表单向每封电子邮件发送电子邮件,但我现在正试图在发送给他们的电子邮件中使用他们的名字,这意味着每封电子邮件都会以"您好, [其名称],"

我使用数组循环查看数据库查询的结果,并将每封电子邮件和名称添加为$mail->addAddress('email@email.com, 'name');

我已尝试在while循环中保存变量$name = $row['name'};,但它会将数据库中的姓氏输入到所有电子邮件中。

我的问题是:是否可以访问该功能的'name'部分并使用每封电子邮件。或者从数据库本身取名是否更好?如果是这样我将如何去做呢?

此外,当电子邮件发送给每个收件人时,它会显示" To:"中的所有收件人。领域。这对隐私来说非常糟糕。有办法防止这种情况吗?

我对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 = 'my@email.com';
$mail->Password = 'mypassword';
$mail->setFrom('myemail@email.com', 'Me');
$mail->addReplyTo('myemail@email.com', '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!';

?>
&#13;
&#13;
&#13;

1 个答案:

答案 0 :(得分:1)

您目前正在设置发送包含多个收件人的单个电子邮件。为了安全和礼仪,您应该给自己发送电子邮件(在循环之外):

$mail->addAddress('myemail@email.com', 'Me');

...然后将所有收件人添加为BCC(在循环内):

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

至于名称字段。在循环中添加调试行并查看输出。每次名称字段是否相同?

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

如果您要向每个收件人发送多封电子邮件,则需要每次在循环内实例化一封新电子邮件。

[UPDATE]

如果您想向每个收件人发送一条消息,请每次(在您的循环内)实例化一封新电子邮件:

<?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 = 'my@email.com';
    $mail->Password = 'mypassword';
    $mail->setFrom('myemail@email.com', 'Me');

    $mail->addReplyTo('myemail@email.com', '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"]}";

}


?>