2017-08-01 3 views
0

J'ai une boucle foreach à partir de laquelle j'envoie des courriels pour mes clients. J'ai 4 clients dans mon db 1,2,3,4 Donc, selon la boucle foreach la boucle tournera 4 fois pour envoyer un e-mail à chaque client Mais dans la première course, il envoie un courriel au client 1. En 2ème Il envoie un e-mail aux clients 1 et 2. En troisième, il envoie un e-mail au client 1, 2, 3 et ainsi de suite.Valeurs de boucle ForEach conservant les valeurs précédentes

Comment puis-je envoyer un e-mail à un client? voici mon 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 
+0

s'il vous plaît utiliser var_dump oder similaire pour créer une sortie de débogage, ce qui est dans l'objet $ mail et à l'intérieur $ lst ['email'] sur chaque appel de boucle –

+0

Basez votre code sur [l'exemple de liste de diffusion fourni avec PHPMailer] (https://github.com/PHPMailer/PHPMailer/blob/master/examples/mailing_list.phps). C'est beaucoup plus efficace que ce que vous avez ici. – Synchro

Répondre

2

Créer un nouvel objet $mail dans la boucle ou mieux encore rétablir les adresses dans la boucle. Vous avez (probablement) déclaré l'objet $mail en dehors de la boucle for.

Ainsi, chaque fois que vous appelez addAddress, vous ajoutez l'adresse e-mail de l'utilisateur. La première fois que vous définissez l'adresse e-mail du premier utilisateur, la deuxième fois que vous ajoutez l'adresse e-mail à la liste, donc deux adresses e-mail. Troisième tour même, quatrième tour etc ..

Modifier: Création d'$mail dans la boucle résout le problème, mais pas efficace. Voir le commentaire de Synchro pour une meilleure façon de créer et d'envoyer l'email.

+0

Oui le mail objecct était en dehors de la boucle. Cela fonctionne bien après avoir placé l'objet mail dans la boucle. Merci – mohit

+0

Ne créez pas l'instance de PHPMailer dans la boucle - c'est inefficace et vous n'avez pas besoin de le faire pour résoudre ce problème. Voir mon commentaire sur la question. – Synchro

2

Pas besoin de créer une instance de PHPMailer dans chaque boucle. Utilisez $mail->clearAddresses(); à la fin de foreach loop pour effacer toutes les adresses.

code mis à jour

$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 
} 

Références:

  1. PHPMailer