ForEach循环值保留以前的值

时间:2017-08-01 09:36:10

标签: php phpmailer

我有一个foreach循环,我正在为我的客户发送电子邮件。 我的db 1,2,3,4中有4个客户 因此,根据foreach循环,循环将运行4次以向每个客户发送电子邮件 但在第一次运行中,它会向客户1发送电子邮件。 在第二轮运行它正在向客户1和2发送电子邮件。 在第三次运行中,它将向客户1,2,3等发送电子邮件。

如何向一位客户发送一封电子邮件。 这是我的代码。

$list=$tmp_con->query("SELECT name,email FROM users WHERE user_type='$tp' AND subscribed='yes' AND verified='1'") or die($tmp_con->error);
    $lis=array();

while($row=$list->fetch_array()){
    $lis[] = $row;
}
foreach($lis as $lst){


         $content = str_replace("{name}", $lst['name'], $mail_content);

         $content=$content."".$append_unsub;

         /**************************************************phpmailer class***********************/

                //$mail->SMTPDebug = 3;                               // Enable verbose debug output

                $mail->isSMTP();                                      // Set mailer to use SMTP
                $mail->Host = $mail_smtp_host;  // Specify main and backup SMTP servers
                $mail->SMTPAuth = true;                               // Enable SMTP authentication
                $mail->Username = $mail_smtp_username;                 // SMTP username
                $mail->Password = $mail_smtp_password;                           // SMTP password
                $mail->SMTPSecure = $mail_smtp_enc;                            // Enable TLS encryption, `ssl` also accepted
                $mail->Port = $mail_smtp_port;                                    // TCP port to connect to

                $mail->setFrom($mail_smtp_from_email, $mail_smtp_from_name);
                $mail->addAddress($lst['email']);     // Add a recipient

                $mail->isHTML(true);                                  // Set email format to HTML

                $mail->Subject = $mail_subject;
                $mail->Body    = $content;


                if(!$mail->send()) {
                    echo 'Message could not be sent.';
                    echo 'Mailer Error: ' . $mail->ErrorInfo;
                } else {
                    echo 'Message has been sent';
                }
            $lst['email']='';            
         /*************************************************php mailer ends here*************************************/


    } ///foreach ends here

2 个答案:

答案 0 :(得分:2)

在循环中创建一个新的$mail对象,甚至可以更好地重置循环中的地址。您(可能)在for循环之外声明了$mail对象。

因此,每次拨打addAddress时,您都会添加用户的电子邮件地址。您第一次设置第一个用户的电子邮件地址时,第二次将电子邮件地址添加到列表中,这样就会有两个电子邮件地址。第三轮相同,第四轮等。

修改:在循环中创建$mail可以解决问题,但效率不高。有关创建和发送电子邮件的更好方法,请参阅Synchro的评论。

答案 1 :(得分:2)

无需在每个循环中创建PHPMailer实例。在foreach循环结束时使用$mail->clearAddresses();清除所有地址。

更新代码

$list = $tmp_con->query("SELECT name,email FROM users WHERE user_type='$tp' AND subscribed='yes' AND verified='1'") or die($tmp_con->error);
$lis = array();

while ($row = $list->fetch_array()) {
  $lis[] = $row;
}

$mail->isSMTP();                                      // Set mailer to use SMTP
$mail->Host = $mail_smtp_host;  // Specify main and backup SMTP servers
$mail->SMTPAuth = true;                               // Enable SMTP authentication
$mail->Username = $mail_smtp_username;                 // SMTP username
$mail->Password = $mail_smtp_password;                           // SMTP password
$mail->SMTPSecure = $mail_smtp_enc;                            // Enable TLS encryption, `ssl` also accepted
$mail->Port = $mail_smtp_port;                                    // TCP port to connect to
$mail->setFrom($mail_smtp_from_email, $mail_smtp_from_name);

foreach ($lis as $lst) {
  $content = str_replace("{name}", $lst['name'], $mail_content);
  $content = $content . "" . $append_unsub;

  //$mail->SMTPDebug = 3;  
  $mail->addAddress($lst['email']);     // Add a recipient
  $mail->isHTML(true); // Set email format to HTML
  $mail->Subject = $mail_subject;
  $mail->Body = $content;

  if (!$mail->send()) {
    echo 'Message could not be sent.';
    echo 'Mailer Error: ' . $mail->ErrorInfo;
  } else {
    echo 'Message has been sent';
  }
  $mail->clearAddresses(); // Clear all addresses for next loop
}

<强>参考文献:

  1. PHPMailer