Search code examples
phpphpmailer

ForEach loop values keeping previous values


I have a foreach loop from which i am sending emails for my customers. I have 4 customers in my db 1,2,3,4 So according to foreach loop the loop will run for 4 times to send an email to every customer But in 1st run it sends email to customer 1. In 2nd run It is sending email to customer 1 and 2. In thirdd run it is sending email to customer 1,2,3 and so on.

How can i make to send one email to one customer. here is my code.

$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

Solution

  • Create a new $mail object in the loop or even better reset the addresses in the loop. You've (probably) declared the $mail object outside the for loop.

    So every time you call addAddress you're adding the email address of the user. The first time you're setting the email address of the first user, then the second time you're adding the email address to the list, so two email addresses. Third round the same, fourth round etc..

    Edit: Creating $mail inside the loop fixes the problem, but isn't efficient. See Synchro's comment for a better way to create and send the email.