Envoi d'emails en masse

Envoi d'emails en masse - PHP - Programmation

Marsh Posté le 28-09-2017 à 16:32:42    

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);

Reply

Marsh Posté le 28-09-2017 à 16:32:42   

Reply

Marsh Posté le 28-09-2017 à 16:41:56    

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

Reply

Marsh Posté le 28-09-2017 à 17:23:56    

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.

Reply

Marsh Posté le 28-09-2017 à 22:03:44    

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

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

?

Reply

Marsh Posté le 29-09-2017 à 09:51:42    

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

Reply

Marsh Posté le 29-09-2017 à 23:21:28    

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
Reply

Marsh Posté le 30-09-2017 à 00:12:23    

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.
Reply

Marsh Posté le 30-09-2017 à 09:32:24    

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
Reply

Marsh Posté le 30-09-2017 à 20:07:52    

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,
 

Reply

Marsh Posté le 30-09-2017 à 20:22:00    

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.
Reply

Marsh Posté le 30-09-2017 à 20:22:00   

Reply

Marsh Posté le 30-09-2017 à 20:39:04    

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 ?

Reply

Marsh Posté le 30-09-2017 à 21:33:11    

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.
Reply

Marsh Posté le 30-09-2017 à 21:44:02    

Ok merci !
Je regarderai le lien.

Reply

Marsh Posté le 01-10-2017 à 18:27:48    

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

Reply

Marsh Posté le 01-10-2017 à 20:23:24    

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
Reply

Marsh Posté le 01-10-2017 à 22:42:41    

Notre propre smtp :)

Reply

Marsh Posté le 01-10-2017 à 23:15:48    

@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
Reply

Marsh Posté le 02-10-2017 à 10:10:46    

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
Reply

Marsh Posté le 02-10-2017 à 12:11:43    

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
Reply

Marsh Posté le 02-10-2017 à 13:04:06    

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

Reply

Marsh Posté le 02-10-2017 à 20:15:08    

Et de bien le configurer :o


---------------
sheep++
Reply

Marsh Posté le 03-10-2017 à 09:52:05    

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
Reply

Marsh Posté le 03-10-2017 à 12:54:12    

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++
Reply

Marsh Posté le 03-10-2017 à 13:24:10    

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
Reply

Marsh Posté le 03-11-2017 à 08:57:45    

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

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed