envoi d'emails en masse et pause avec sleep ou usleep

WRInaute passionné
Bonjour,

Je dois faire un emailing vers plus de 5000 adresses contenues dans une bdd.

Mon script d'envoi fonctionne car testé avec une dizaine d'adresse, mais avant de balancer la base complète, je ne sais pas si il est préféreble de séparer la base pour faire plusieurs paquets et envoyer par exemple par paquet de 200 ou bien envoyer le tout et mettre un simple sleep (2) dans ma boucle while pour faire une pause de 2 secondes entre chaque envoi de mail.

Qu'en pensez vous ?

personellement, je préfère la solution du sleep pour la facilité.
 
WRInaute impliqué
Salut,

Je pense pas que ce soit une bonne idée. Normalement, tu peux tout envoyer en paquet sans te soucier d'un problème.

Imagine que tu fasses un sleep de 2 secondes après chaque envoi et prenons en compte que pour envoyer un e-mail cela prenne que 0.001 secondes, voici un simple calcul :

((5000*2.001)/60)/60) = 2h, donc est-ce que ton script peut tourner 2 heurs sur ton hébergement ?

A+
 
WRInaute passionné
donc est-ce que ton script peut tourner 2 heurs sur ton hébergement ?

C'est sur un dédié donc, j'imagine que c'est possible, mais cela risque peut etre de faire aboyer un chien de garde.

Bon, admettons que je laisse tomber la solutiin du sleep dans la boucle, comment puis-je séparer automatiquement la base en paquets ?

Je ne maitrise pas assez mysql pour être sur de mon coup, peut-être avez-vous des bouts de scripts tout fait pour ce genre de manip?
 
WRInaute passionné
La question que je me pose c'est : pourquoi spliter ta base ? Ou est le problème d'envoyer le tout en paquet ?

Je ne sais pas, peut-être que je crains un probleme, par exemple en utilisant trop de ressource cpu, ou que sais-je.

C'est la première fois que j'ai à traiter ce genre de demande donc, je préfère m'appuyer sur des gens qui ont de l'expérience dans ce genre de manip.

actuellement je fait de manière simple :

Code:
$req=mysql_query("SELECT email FROM liste");
$res=mysql_numrows($req);
$i=0;
while($i!=$res) {
   $email=mysql_result($req,$i,"email");
   mail($email,$_POST['sujet'],$_POST['news'],$headers);
    $i++;
}
mysql_close();
?>

ça tourne bien pour une dizaine de mails mais est-ce que je peux lancer la même chose si la base contient 5000 adresses sans risque ?
 
WRInaute impliqué
Si tu veux laisser souffler le serveur de temps en temps, ce que tu peux faire c'est tous les 200 e-mails envoyé tu fais un sleep de 2-3 secondes.

Dans le cas de ton code tu devrais faire un $j = 0; avant le while et mettre une condition du genre :

Code:
if($j => 200){ sleep(2); $j = 0;}

N'oublie pas d'incrémenter le $j

A+
 
WRInaute passionné
merci Sir Dipp pour ta suggestion, je teste

Code:
<?
$req=mysql_query("SELECT email FROM liste");
$res=mysql_numrows($req);
$i=0;
$j=0;
while($i!=$res) {

   if($j => 200){
   sleep(2); $j = 0;}

   $email=mysql_result($req,$i,"email");
   mail($email,$_POST['sujet'],$_POST['news'],$headers);
    $i++;
	$j++;
}
mysql_close();
?>
 
WRInaute passionné
Bon, et bien cela ne semble pas fonctionner, pourtant ça semble simple, mais si je mets le if je n'ai pas d'emails qui partent. :(
 
WRInaute accro
if($j => 200)
si J est supérieur ou égal a 200, ca tique pas là?? il commence à 0 et tu l'incrémente dans cette boucle alors ca risque pas de démarrer !
 
WRInaute passionné
:roll:
le if se ferme avant d'envoyer les mails, il ne sert qu'à faire une pause dans la boucle non ?
 
WRInaute passionné
Je ferais un traitement qui envoi X mails avec l'option LIMIT dans le SELECT et qui met un flag "traité" dans la table des emails. Ensuite un petit cron qui se lance tous les X minutes.
 
WRInaute passionné
tu fais un sleep de 20 secondes
puis tu en envoies 20 et tu mets une redirection avec l'id du dernier mail envoyé en parametre

rog
 
WRInaute accro
les sleep ont toujours généré des doublons (voire meme plus) chez moi :)

C'est webmasterlamogere qui a donné la meilleure solution...

Ah oui, a la question de savoir pourquoi pas tout envoyer d'un bloc ? C'est sans doute le meilleur moyen de se faire blacklister par les serveurs de mail :)
 
WRInaute passionné
oui mahefarivony, je suis tomber au cours de mes recherches sur un topic que tu avais lancé à ce sujet.
C'est pour ça que j'hésitais sur la solution du sleep

La solution du cron m'inspirais déja mieux, mais n'ayant utilisé ce service jusque là, je crains de pinailler pendant des heures avant de faire fonctionner correctement le système.
 
WRInaute passionné
nop

dans mon cas le sleep est lancé avant les envois

et la redirection bypass les restrictions max time de l'hebergeur

accessoirement tu peux aussi ecrire l'id du dernier mail envoyé au cas ou il y aurait un crash

rog
 
WRInaute passionné
Bon, la tâche cron fonctionne parfaitement, j'ai fait un petit test avec mon script qui s'execute chaque minute. finalement ça c'est pas sorcier à paramétrer.

Me reste maintenant à découper ma base pour faire par exemple des paquets de 200
 
Discussions similaires
Haut