2017-08-01 106 views
0

我有一个foreach循环,我从中为我的客户发送电子邮件。 我有我的分贝1,2,3,4 所以根据foreach循环循环将运行4次发送电子邮件给每个客户 但在第一次运行它发送电子邮件给客户1. 在第2次运行它发送电子邮件给客户1和2. 在第三次运行中,它发送电子邮件给客户1,2,3等。ForEach循环值保持以前的值

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

$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 
+0

请用var_dump奥德类似于创建调试输出,什么是$邮件对象内部和$内每个循环调用lst ['email'] –

+0

将您的代码基于[PHPMailer提供的邮件列表示例](https://github.com/PHPMailer/PHPMailer/blob/master/examples/mailing_list.phps)。它比你在这里的效率高得多。 – Synchro

回答

2

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

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

编辑:在循环内创建$mail修复问题,但效率不高。请参阅Synchro的评论,以获得更好的创建和发送电子邮件的方式。

+0

是的邮件对象是在循环之外。将邮件对象放入循环后它的工作正常。谢谢 – mohit

+0

不要在循环内部创建PHPMailer实例 - 效率低下,您不需要这样做来解决此问题。看到我对这个问题的评论。 – Synchro

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