Page 1 sur 1

impossible de boucler sur tableau avec foreach

Posté : 11 août 2023, 14:53
par MiaoLee
Bonjour,
Je me permets de poster car je souhaiterai envoyer un mail et boucler pour que le mail soit envoyer une liste de diffusion.
Mais il ne l'envoi uniquement à la première personne

Voici mon code pour la liste de diffusion :
$liste_diff = [];
    
    // - Liste de diffusion
    if(isset($_POST['list']) && $_POST['list']){
        $rs_list = $conn->prepare('SELECT DISTINCT c.mail FROM compte c
        INNER JOIN tl_compte_foyer cf ON cf.idx_compte = c.id_compte
        INNER JOIN utilisateur u ON c.id_compte = u.idx_compte
        INNER JOIN tl_utilisateur_foyer uf ON uf.idx_utilisateur = u.id_utilisateur
        WHERE cf.idx_foyer = ? AND uf.mailing = 1');
        $rs_list->bindParam(1,$_SESSION['foyer']);
        $rs_list->execute();
        foreach( $rs_list as $list){
            array_push($liste_diff,$list[0]);
        }
    }
    if(isset($_POST['address']) && $_POST['address'] != ""){
        foreach ($address as $add){
            array_push($liste_diff,$add);
        }
    }

    // - Liste Admin
    if(isset($_POST['admin']) && $_POST['admin']){
        $rs_admin = $conn->prepare('SELECT DISTINCT c.mail FROM xxx c
            INNER JOIN xxx cf ON cf.xx = c.xx
            INNER JOIN xx u ON c.xx = u.xx
            INNER JOIN xx uf ON uf.xx = u.xx
            WHERE cf.xx = ? AND uf.admin = 1
        ');
        $rs_admin->bindParam(1,$_SESSION['foyer']);
        $rs_admin->execute();
        // $rs_admin->fetch();
        foreach( $rs_admin as $index =>$admin){
            array_push($liste_diff,$admin[0]);
        }
    }

    $liste_diff  = array_unique($liste_diff);

    var_export($liste_diff);
Voici le retour de var_export :
array ( 0 => '[email protected]', 1 => '[email protected]', 2 => '[email protected]', 3 => '[email protected]', 4 => '[email protected]', )

Voici le code de phpmailer qui envoi les mails :
$mail = new PHPMailer(true);

        try {
            
            foreach($liste_diff as $diff){

                //Server settings
                $mail->SMTPDebug = 0;                      //Enable verbose debug output
                $mail->isSMTP();                                            //Send using SMTP
                $mail->Host       = $dmail['smtp'];                         //Set the SMTP server to send through
                $mail->SMTPAuth   = true;                                   //Enable SMTP authentication
                $mail->Username   = $dmail['mail'];                         //SMTP username
                $mail->Password   = $dmail['pass'];                         //SMTP password
                $mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS;            //Enable implicit TLS encryption
                $mail->Port       = $dmail['port'];                         //TCP port to connect to; use 587 if you have set `SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS`
                $mail->CharSet    = "UTF-8";
                
                //Recipients
                $mail->setFrom($dmail['mail']);
                $mail->addAddress($diff);     //Add a recipient
                //$mail->addAddress('[email protected]');               //Name is optional
                //$mail->addReplyTo('[email protected]', 'Information');
                //$mail->addCC('[email protected]');

                

                
                // $mail->addBCC($diff);
                
                
                //Attachments
                //$mail->addAttachment('/var/tmp/file.tar.gz');         //Add attachments
                //$mail->addAttachment('/tmp/image.jpg', 'new.jpg');    //Optional name

                //Content
                $mail->isHTML(true);                                  //Set email format to HTML
                $mail->Subject = $objet;
                $mail->Body    = $message;
                $mail->AltBody = 'This is the body in plain text for non-HTML mail clients';

                if($mail->send()){
                    $mail_ok = true;
                }
            }
merci pour vos retous

Re: impossible de boucler sur tableau avec foreach

Posté : 11 août 2023, 15:03
par or 1
il faut vérifier si les mails arrivent bien chez orange avec un exemple tout simple d'une adresse orange.

Re: impossible de boucler sur tableau avec foreach

Posté : 11 août 2023, 20:43
par @rthur
Tu peux mettre un echo dans ta boucle pour vérifier qu'elle s'exécute bien plusieurs fois.
A noter que si ton mécanisme est pour envoyer des mails à un nombre important de destinataires (en gros + de 50) il est préférable de passer par une plateforme d'envoi de mails pour éviter de tomber en spam chez les destinataires

Re: impossible de boucler sur tableau avec foreach

Posté : 11 août 2023, 21:57
par two3d
Vérifie comme dit @arthur et ne remets pas à chaque fois tous les "$mail->..." dans ta boucle, inutiles de les redéclarer. Par contre, laisse " $mail->addAddress($diff);" et fais un "$mail->clearAddresses();" juste après "addAddress" pour pas que le prochain envoi ajoute le mail précédent à la liste des personnes qui vont recevoir le mail.

https://hotexamples.com/examples/-/PHPM ... mples.html

Ton "try/catch" est à mettre dans ton foreach, pas le foreach dans le "try/catch".

"$mail->CharSet = "UTF-8";" est inutile, c'est le charset par défaut, il me semble.

Re: impossible de boucler sur tableau avec foreach

Posté : 13 août 2023, 19:45
par MiaoLee
Vérifie comme dit @arthur et ne remets pas à chaque fois tous les "$mail->..." dans ta boucle, inutiles de les redéclarer. Par contre, laisse " $mail->addAddress($diff);" et fais un "$mail->clearAddresses();" juste après "addAddress" pour pas que le prochain envoi ajoute le mail précédent à la liste des personnes qui vont recevoir le mail.

https://hotexamples.com/examples/-/PHPM ... mples.html

Ton "try/catch" est à mettre dans ton foreach, pas le foreach dans le "try/catch".

"$mail->CharSet = "UTF-8";" est inutile, c'est le charset par défaut, il me semble.
le try catch dans le foreach fonctionne bien.
Merci a tous.