Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1284 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  Envoi d'emails en masse

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Envoi d'emails en masse

n°2306123
mecano31
Posté le 28-09-2017 à 16:32:42  profilanswer
 

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.
 
Je vous mets ci-dessous mon code avec l'exemple.
 
Merci pour votre aide !
 

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

mood
Publicité
Posté le 28-09-2017 à 16:32:42  profilanswer
 

n°2306124
antac
..
Posté le 28-09-2017 à 16:41:56  profilanswer
 

Et quel est le problème précisément ?

n°2306128
mecano31
Posté le 28-09-2017 à 17:23:56  profilanswer
 

Le problème est que je n'arrive pas à faire arrêter le script au bout de 100 mails envoyés pendant 10 secondes et ensuite reprendre l'envoi pour les mails auxquels je n'ai pas fait d'envoi.

n°2306144
antac
..
Posté le 28-09-2017 à 22:03:44  profilanswer
 

C'est à dire qu'il ne rentre jamais dans  

Code :
  1. if ($i % $nbr == 0){
  2.              sleep(10);
  3.         }

?

n°2306169
mecano31
Posté le 29-09-2017 à 09:51:42  profilanswer
 

Oui c'est exactement.
Je souhaiterais savoir, qu'est-ce qui ne va pas dans mon code ?
Je n'ai pas de message d'erreur et l'envoi se passe bien. C'est juste qu'il ne prend pas en compte la condition suivante :  

Code :
  1. if ($i % $nbr == 0){
  2.      sleep(10);
  3. }

n°2306201
rufo
Pas me confondre avec Lycos!
Posté le 29-09-2017 à 23:21:28  profilanswer
 

L45, je pense que tu voulais mettre $nbr++; et non juste $++; :/
T'incrémente jamais $nbr. L'erreur classique :o
 
Edit : au passage, pourquoi faire un sleep de 10s et pas juste exécuter le script en envoyant 100 mails et le relancer quelques secondes plus tard avec cron ?


Message édité par rufo le 29-09-2017 à 23:22:45

---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°2306202
MaybeEijOr​Not
but someone at least
Posté le 30-09-2017 à 00:12:23  profilanswer
 

En effet la ligne 45 reste mystérieuse, par contre je ne vois pas l'intérêt d'incrémenter $nbr Rufo. :??:  
 
Mecano31, comment sais-tu qu'il ne fait pas la pause?


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
n°2306203
rufo
Pas me confondre avec Lycos!
Posté le 30-09-2017 à 09:32:24  profilanswer
 

Effectivement, j'avais pas vu que $nbr était défini L7.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°2306231
mecano31
Posté le 30-09-2017 à 20:07:52  profilanswer
 

Bonjour,
 
Merci à tous pour vos réponses.
@MaybeEijOrNot, pour répondre à ta question, quand j'envoie les 100 premiers emails ça passe mais après je n'ai rien d'autre.
Peut être faut-il que je réexecute le code à nouveau pour qu'il sache envoyer le reste de mails ? Si c'est le cas comment lui dire à partir de quel compteur recommencer l'envoi ? Est-ce que possible de le faire automatiquement sans rechargement de la page ?
 
Merci !
 
Cdlt,
 

n°2306233
MaybeEijOr​Not
but someone at least
Posté le 30-09-2017 à 20:22:00  profilanswer
 

Ok donc en fait ça n'a probablement rien à voir. Je penche plus vers un temps d’exécution trop long, dans le php.ini tu dois avoir un temps d’exécution de paramétré, si le script mais plus de temps alors il est abandonné.
 
Par contre, quoi qu'il en soit, d'après les notes de php.net : http://php.net/manual/fr/function.mail.php tu ferais mieux d'utiliser une library spécialisée pour l'envoie de masse de mails.


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
mood
Publicité
Posté le 30-09-2017 à 20:22:00  profilanswer
 

n°2306237
mecano31
Posté le 30-09-2017 à 20:39:04  profilanswer
 

Concernant le librairie j'ai pensé à Swiftmailer. C'est une librairie bien adaptée pour l'envoi d'une liste de distribution.
Je vais étudier cette librairie et je reviendrai en cas de question. Par contre, même avec une librairie, il faut programmer pour que à partir d'un certain nombre d'emails envoyés, mettre de une pause puis reprendre.
 
Ou bien n'a-t-on besoin de pause avec une librairie ? Peut-on envoyer autant d'emails sans interruption dans ce cas ?

n°2306246
MaybeEijOr​Not
but someone at least
Posté le 30-09-2017 à 21:33:11  profilanswer
 

Aucune idée, à voir ce qu'ils conseillent dans la doc de la library. En général je pense que tu fais plus un découpage par tas au niveau de la requête pour la bdd.
 
Je partirai plus vers un script récursif ce qui permet de découper aussi bien les requêtes que les envois.
 
Sinon quelques recherches Google t'en diront plus. Bon là c'est un cas extrême mais dans les réponses tu as pas mal d'éléments apportés : https://stackoverflow.com/questions [...] ils-weekly


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
n°2306248
mecano31
Posté le 30-09-2017 à 21:44:02  profilanswer
 

Ok merci !
Je regarderai le lien.

n°2306263
antac
..
Posté le 01-10-2017 à 18:27:48  profilanswer
 

J'utilise une technique similaire pour l envoi de mails. J'utilise une table dans ma base de données avec une colonne indiquant si le mail a bien été envoyé. Comme ça lors de la nouvelle exécution, ma requête ne s'attarde que sur les mails non envoyés

n°2306264
rufo
Pas me confondre avec Lycos!
Posté le 01-10-2017 à 20:23:24  profilanswer
 

T'utilises quel SMTP pour l'envoi. Moi, je rencontre souvent des pbs d'envois bloqués par 1&1 ou free.fr, sans doute parce que je dépasse des quotas (mais j'ignore leurs métriques, peut-être 100 mails/h ou 500 mails/jour ?). J'ai fiat un système dans mon appli qui retente l'envoi un certain nb de fois durant une certaine période tant que le mail n'a pas réussi à être envoyé.
Je fais l'envoi depuis un Nas Synology. Mais je maîtrise pas les aspects SPF, DKIM, PTR :( Je sais pas trop comment ça se configure...


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°2306267
antac
..
Posté le 01-10-2017 à 22:42:41  profilanswer
 

Notre propre smtp :)

n°2306268
mecano31
Posté le 01-10-2017 à 23:15:48  profilanswer
 

@rufo, j'utilise aussi notre propre SMTP.
@antac,

Citation :

J'utilise une technique similaire pour l envoi de mails. J'utilise une table dans ma base de données avec une colonne indiquant si le mail a bien été envoyé. Comme ça lors de la nouvelle exécution, ma requête ne s'attarde que sur les mails non envoyés


 
Comment tu fais la nouvelle exécution ? Est-ce à la main ou automatiser ?


Message édité par mecano31 le 01-10-2017 à 23:16:20
n°2306269
antac
..
Posté le 02-10-2017 à 10:10:46  profilanswer
 

C'est automatisé (tâche planifiée), les e-mails sont envoyés par vagues. Toutes les 15 minutes, ma tache planifiée exécute le script qui envoi la sauce si il y a des mails en attente à envoyer par lot de 100 avec 50s d'attente entre chaque lot.


Message édité par antac le 02-10-2017 à 10:10:58
n°2306273
rufo
Pas me confondre avec Lycos!
Posté le 02-10-2017 à 12:11:43  profilanswer
 

Question bête (désolé le squat) : comment fait-on pour mettre en place son propre SMTP ? Moi, actuellement, je dois passer par Free ou 1&1. Comment fait-on pour avoir le droit d'émettre des mails ?
 
Merci :jap:


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°2306274
antac
..
Posté le 02-10-2017 à 13:04:06  profilanswer
 

Il suffit d'avoir un logiciel ou un serveur de messagerie (c'est notre cas).

n°2306280
h3bus
Troll Inside
Posté le 02-10-2017 à 20:15:08  profilanswer
 

Et de bien le configurer :o


---------------
sheep++
n°2306289
rufo
Pas me confondre avec Lycos!
Posté le 03-10-2017 à 09:52:05  profilanswer
 

Je pense que c'est surtout ce point qui m'intéresse mais dur quand on ne s'y connaît pas trop dans ce domaine :(


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°2306294
h3bus
Troll Inside
Posté le 03-10-2017 à 12:54:12  profilanswer
 

Quand j'ai démarré avec postfix + cyrus, j'ai lu pas mal de doc et trouvé plein d'infos/tuto sur le net.
On m'avait conseillé de mettre en place SPF + DKIM ce que j'ai fais. Ce n'est pas très compliqué.
 
Par contre le système est vraiment touffu est customisable à tous les niveaux. Quand on veut sortir un peu des sentiers battus il faut y passer pas mal de temps.
 
Il m'a fallu un week end antier pour passer à une authentification et gestion des boites mail LDAP.


---------------
sheep++
n°2306295
rufo
Pas me confondre avec Lycos!
Posté le 03-10-2017 à 13:24:10  profilanswer
 

Je vois. L'ennui c'est qu'il faut que la solution marche sur un NAS Synology (donc prendre en compte les éventuelles limitations).
 
Pour trop squatter ce topic, j'en ai ouvert un ici : http://forum.hardware.fr/forum2.ph [...] =0#t993066


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°2307237
bounif11
Posté le 03-11-2017 à 08:57:45  profilanswer
 

J'ai eu ce même problème avec l'envoi de newsletter pour mon 1er blog.

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  Envoi d'emails en masse

 

Sujets relatifs
Formulaire d'envoi de fichier[RESOLU] PHP $_POST vide après envoi de formulaire
Envoi d'informations en format kexadecimal en langage Cvba outlook envoi de mail
système référentiel / masse vitesse et position relative.[JQueryUI] Envoi données javascript en BDD
delphi - envoi de ligneproblème socket et envoi paquet UPD
Programme qui récupere une trame et l'envoi via liaison XbeeC : Envoi et retour d'un tableau dans des fonctions.
Plus de sujets relatifs à : Envoi d'emails en masse


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR