IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

[PHP] Envoi d'e-mail en masse


Sujet :

PHP & Base de données

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    161
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 161
    Points : 50
    Points
    50
    Par défaut [PHP] Envoi d'e-mail en masse
    Bonjour à tous,

    Je suis en train de réaliser un système d'envoi de newsletter pour une liste de distribution.
    L'envoi marche bien, le seul souci est de mettre un arrêt de 10 seconde au bout de (100 emails envoyés par exemple) et ensuite reprendre l'envoi pour la suite.
    C'est à dire que mon script ne rentre jamais dans cette condition :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if ($i % $nbr == 0){
           sleep(10); 
    }
    Je vous mets ci-dessous mon code avec l'exemple.

    Merci pour votre aide !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    $query = "select email from dbtable where sub_status = 1 LIMIT 1000";
    $req = $db->prepare($query);
    $req->execute() or die(print_r($req->errorInfo()));
    $rows = $req->fetchAll();
     
    $emails = array();
    $nbr = 100;
    $i = 0;
     
    foreach ($rows as $row) {
        $emails[]=$row['email'];
    }
     
    $count =  file_get_contents("count.txt");
     
    for($i=$count;$i<count($emails);$i++){
        $to  = $emails[$i];
        $subject = 'Titre';
     
            if ($i % $nbr == 0){
                 sleep(10); 
            }        
     
            $message = file_get_contents("newsletter.html");
     
            $headers  = 'MIME-Version: 1.0' . "\r\n";
        $headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
            $headers .= 'From: Name <info@domain.com>' . "\r\n";
     
            if(mail($to, $subject, $message, $headers)) {
                $file = fopen("sentlist.txt","a+"); 
                fwrite($file, $to.",\r\n");
                fclose($file);
         } else {
                    $file = fopen("notsentlist.txt","a+"); 
                fwrite($file, $to.",\r\n");
                fclose($file);
             }
     
             if(($i-$count)>=1000) {   
                $filec = fopen("count.txt",'w');
                fwrite($filec, $i);
                fclose($filec);
                break;
          }   
     
             $++;
    }
    $filec = fopen("count.txt",'w');
    fwrite($filec, $i);
    fclose($filec);

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Qu'est ce qui te permets de dire que tu ne rentres pas dans la condition ?

    Au passage, tu as un
    qui se ballade ligne 48.

    Également, sur la lecture des données, pourquoi mets-tu le résultat de la requête dans un tableau, pour parcourir ce tableau et refaire un tableau pour ensuite parcourir le deuxième tableau pour faire le traitement ?

    Traites les données simplement depuis la requête (et pas besoin de prepare() ici non plus)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $query = "select email from dbtable where sub_status = 1 LIMIT 1000";
    $req = $db->query($query);
    while ($row = $req->fetch()) {
        $to  = $row['email'];
        $subject = 'Titre';
    Une méthode plus simple et précise pour traiter les lots et d'avoir une colonne dans la base de données indiquant si la ligne a été traitée ou non.
    Tu peux donc directement requêter 1000 lignes non traitées sans te soucier de gérer une position.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre confirmé
    Homme Profil pro
    Déveleoppeur Web/Mobile
    Inscrit en
    Avril 2013
    Messages
    330
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Déveleoppeur Web/Mobile
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 330
    Points : 545
    Points
    545
    Par défaut
    Pourquoi ne pas faire une condition simple au lieu d'un modulo ?

  4. #4
    Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    161
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 161
    Points : 50
    Points
    50
    Par défaut
    Re,

    Merci @sabotage et @Rpass pour vos réponses.

    Pour répondre à la ques de @sabotage :
    Qu'est ce qui te permets de dire que tu ne rentres pas dans la condition ?
    Quand je lance l'envoi de ma newsletter, j'envoie les 100 premiers mails et ensuite je n'ai rien d'autres. C'est ci qui m'amène à supposer que je rentre pas dans la condition mentionnée. Comment fas-tu avec cette partie du code ? :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $count =  file_get_contents("count.txt");
    for($i=$count;$i<count($emails);$i++)
    {
    }
    Pour @Rpass, est la variable qui détermine le nombre de mails à envoyer par paquet (soit 100 sur un total de 1000). Et est la variable qui s'incrémente au fur et à mesure de l'envoi. D’où à la fin j'ai mis : $i++;

    Pour savoir si on a atteint les 100 mails envoyés par paquet, il faut que $i % $nbr soit égale à 0. D’où la condition :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    
    if ($i % $nbr == 0){
       sleep(10); 
    }
    Cdlt,

  5. #5
    Membre confirmé
    Homme Profil pro
    Déveleoppeur Web/Mobile
    Inscrit en
    Avril 2013
    Messages
    330
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Déveleoppeur Web/Mobile
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 330
    Points : 545
    Points
    545
    Par défaut
    Je te conseille de faire un echo ou un die dans ta boucle pour vérifier qu'il passe dans ta condition .
    S'il s'arrête au bout de 100 c'est que soit tu as 100 mails en BDD soit le sleep fait planter le script

  6. #6
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Citation Envoyé par dinolam81 Voir le message
    Quand je lance l'envoi de ma newsletter, j'envoie les 100 premiers mails et ensuite je n'ai rien d'autres.
    Question bête : combien de mails étais-tu censé envoyer ? Tu peux faire des essais en modifiant le nombre de mails par vague, pour voir si tu restes coincé à une seule vague, à 100 mails....
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  7. #7
    Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    161
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 161
    Points : 50
    Points
    50
    Par défaut
    @Celira,

    Le nombre total de mails à envoyer est 1000.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    
    $query = "select email from dbtable where sub_status = 1 LIMIT 1000"; 
    $req = $db->query($query);
    Même en changeant le nombre (50 par exemple) ça n'envoie que 50.

    Cdlt,

  8. #8
    Membre confirmé
    Homme Profil pro
    Déveleoppeur Web/Mobile
    Inscrit en
    Avril 2013
    Messages
    330
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Déveleoppeur Web/Mobile
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 330
    Points : 545
    Points
    545
    Par défaut
    C'est bien ton sleep qui fait planter donc .

    T'as check les erreurs les logs php ?

  9. #9
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    A tout hasard: quelle est la valeur du max_execution_time ?
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  10. #10
    Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    161
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 161
    Points : 50
    Points
    50
    Par défaut
    Re,

    @Celira, la valeur du max_execution_time est de 120.
    @Rpass, un check les erreurs les logs php m'affiche des suivantes :

    - PHP Notice: Undefined index: in C:\wamp\www\news\envoick.php on line 18 correspondant à : - PHP Warning: A non-numeric value encountered in C:\wamp\www\news\envoick.php on line 41 correspondant à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (($j-$count)>=1000) {
    Mais ces erreurs n'empêchent pas l'envoi des mails.

    Cdlt,

  11. #11
    Membre confirmé
    Homme Profil pro
    Déveleoppeur Web/Mobile
    Inscrit en
    Avril 2013
    Messages
    330
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Déveleoppeur Web/Mobile
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 330
    Points : 545
    Points
    545
    Par défaut
    Je comprends pas trop ce que tu cherches à faire avec le fichier count.txt. Peux tu expliquer plus en détails
    Pour le coup tu ne vas pas juste parcourir tous les mails et les envoyer avec une intervalle de 10sec tous les 100 mails ?

    - PHP Notice: Undefined index: in C:\wamp\www\news\envoick.php on line 18 correspondant à :
    Mais ces erreurs n'empêchent pas l'envoi des mails.
    Dans ce cas ça pose problème car sans l'email de destination l'email ne partira pas.

  12. #12
    Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    161
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 161
    Points : 50
    Points
    50
    Par défaut
    count.txt est utilisé pour stocker le nombre d'e-mails courants envoyés.
    Cela enverra 1000 e-mails de la base de données par exécution et sera
    utilisé comme point de départ de la prochaine exécution.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    if(($i-$count)>=1000) {   
        $filec = fopen("count.txt",'w');
        fwrite($filec, $i);
        fclose($filec);
        break;
    }   
    
    $filec = fopen("count.txt",'w');
    fwrite($filec, $i);
    fclose($filec);

  13. #13
    Membre confirmé
    Homme Profil pro
    Déveleoppeur Web/Mobile
    Inscrit en
    Avril 2013
    Messages
    330
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Déveleoppeur Web/Mobile
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 330
    Points : 545
    Points
    545
    Par défaut
    Tu as les erreurs php à chaque exécution ? Corrige les erreurs pour voir si tu as toujours le problème

Discussions similaires

  1. [Newsletter] Envoi de mail en masse par paquet en PHP
    Par wouha dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 4
    Dernier message: 09/01/2014, 18h32
  2. Envoi d'e-mail en masse
    Par sarah65536 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 18
    Dernier message: 25/06/2009, 15h00
  3. Envoi d'e-mails en masse
    Par Gizmil dans le forum Internet
    Réponses: 8
    Dernier message: 22/01/2008, 11h36
  4. [Mail] Envoi d'e-mail en masse
    Par nicaud dans le forum Langage
    Réponses: 5
    Dernier message: 21/01/2007, 11h04
  5. [Mail] envoi mail en masse avec fonction bcc
    Par jarod71 dans le forum Langage
    Réponses: 5
    Dernier message: 08/03/2006, 11h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo