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

  FORUM HardWare.fr
  Programmation
  PHP

  [PHP] Faire un script simple de mailing

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[PHP] Faire un script simple de mailing

n°776292
Profil sup​primé
Posté le 24-06-2004 à 16:26:41  answer
 

J'aimerais avoir quelques conseils pour programmer un script de mailing avec la fonction mail()
J'aimerais en envoyer environ 300 à 500 et que les personnes recevant le mail ne voient pas les autres mails des autres personnes présentes dans ma mailing liste. Est ce que c'est possible en un seul script et est ce que je ne vais pas avoir des problemes de timeout ?
 
Merci de vos conseils
++
JardY

mood
Publicité
Posté le 24-06-2004 à 16:26:41  profilanswer
 

n°776319
T509
$job->GetJob(now)
Posté le 24-06-2004 à 16:34:46  profilanswer
 

pour le problème du timeout, cela dépend de ton hébergement. S'il s'agit de ta machine perso ou d'un serveur dédié, pas de souci puisque tu contrôle le paramètre de temps d'exécution max. Si c'est un serveur mutualisé, il faut compter environ 30 secondes autorisé par script typiquement.
J'ai déjà fait des mesures et envoyer un mail prenait en moyenne moins de 0.1 secondes. Donc tu fais le calcul, c'est trop court pour 500 mails.
 
Pour un script, regarde la classe phpmailer. Elle est souple et efficace.


---------------
fermez vos topics résolus avec le tag [Résolu] en fin de titre. Merci !
n°776339
harrysauce
Miaaaooou!
Posté le 24-06-2004 à 16:42:18  profilanswer
 

Pour une application j'avais fait un truc qui calcule le temps moyen d'envoi d'un mail, et avant chaque envoi teste si on aura le temps d'envoyer le prochain mail (avec une petite marge). Si oui, on envoi le mail, et on met à jour le temps moyen d'envoi d'un mail, sinon ca envoi au navigateur une ligne en javascript qui recharge la même page avec en paramètre l'id du mail sur lequel on s'est arrêté, et l'envoi se poursuit à partir de ce mail...


Message édité par harrysauce le 24-06-2004 à 16:44:24
n°776372
T509
$job->GetJob(now)
Posté le 24-06-2004 à 16:56:26  profilanswer
 

J'avais fait un truc pareil, mais c'est une usine à gaz (de mon coté)
 
Tu as du code ?


---------------
fermez vos topics résolus avec le tag [Résolu] en fin de titre. Merci !
n°776456
harrysauce
Miaaaooou!
Posté le 24-06-2004 à 17:23:05  profilanswer
 

Oué :
 
 
En gros ca donne un truc comme ca (j'ai viré certains trucs...)

Code :
  1. <?
  2. // fonction permettant de récupérer le temps écoulé depuis le 1 - 1 1970
  3. function temps(){
  4. $time = microtime();
  5. $tableau = explode(" ",$time);
  6. return ($tableau[1] + $tableau[0]);
  7. }
  8. //On lance le compteur
  9. $debut = temps();
  10. //Id de la newsletter à envoyer
  11. $idNewsletter = $_GET["idNewsletter"];
  12. if ($idNewsletter == "" ){
  13. echo "Erreur, aucun identifiant de newsletter";
  14. exit();
  15. }
  16. //Id du dernier util pour qui le mail a été envoyé
  17. $start = $_GET["start"];
  18. //On insère des espaces, pour forcer IE à afficher la page même si elle est en cours d'éxécution
  19. for($i = 0; $i < 1024; $i++){
  20. echo " ";
  21. }
  22. //On recupère les infos sur la newsletter
  23. $rsnews = &$conn->Execute("SELECT * FROM newsletter WHERE id_newsletter=$idNewsletter" );
  24. //Requête permettant de récupérer la liste des mails
  25. $sql = "SELECT * FROM mail_newsletter WHERE id_mail_newsletter > $start ORDER BY id_mail_newsletter ASC";
  26. $rs = &$conn->Execute($sql);
  27. $i = 0;
  28. //On parcours tant qu'il reste des personnes à qui envoyer le mail
  29. while(!$rs->EOF){
  30. $id = $rs->fields[0];
  31. $dest = $rs->fields[1];
  32. $mesg = $rsnews->fields[1];
  33. $exp  = $rsnews->fields[3];
  34. $sujet= $rsnews->fields[2];
  35. $i++;
  36. //On envoi le mail
  37. if (SendMail($dest, $sujet, $mesg, $exp, $type_mail)){
  38.  echo "<span class=\"mail\">" . $id . " - " . $rs->fields[1] . " [<span class=\"mailok\">OK</span>]</span><br>";
  39. }else{
  40.  echo "<span class=\"mail\">" . $id . " - " . $rs->fields[1] . " [<span class=\"mailerreur\">ERREUR</span>]</span><br>";
  41. }
  42. //On récupère le temps
  43. $milieu = temps();
  44. //On le formate
  45. $total = $milieu - $debut;
  46. $total = round($total,3);
  47. $moyenne = round($total/$i, 3);
  48. //Si on a pas le temps d'envoyer le mail suivant avant la fin de limite de temps
  49. //On s'arrête ici, et on affiche le javascript de redirection
  50. if ( ($total + $moyenne + $marge) > $time_limit){
  51.  echo "<SCRIPT LANGUAGE=\"JavaScript\">document.location.href='exp_newsletter.php?idNewsletter=$idNewsletter&start=$id';</SCRIPT>";
  52.  exit();
  53. }
  54. //On affiche ce qui vient d'être mis dans le tampon
  55. ob_flush();
  56. flush();
  57. $rs->MoveNext();
  58. }
  59. ?>


 
Par contre je sais pas si ca va marcher, parce que j'ai viré pas mal de trucs...
 
Pour la base de données j'ai utilisé ADODB, la fonction SendMail est définie dans un fichier inclus, $marge est dans un fichier de config lui aussi inclus, et je dois sûrement en oublier pleins d'autres...
 
EDIT : ah oué, $time_limit est aussi dans un fichier de conf, je sais pas si y'a un moyen de le récupérer dynamiquement, j'avais un peu la flemme de chercher, donc je l'ai foutu en dur :o


Message édité par harrysauce le 24-06-2004 à 17:26:56
n°776480
T509
$job-&gt;GetJob(now)
Posté le 24-06-2004 à 17:29:21  profilanswer
 

C'est plus léger que ce que j'avais fait. j'avais mis 2 jours à débugger pour envoyer mon CV à 415 cabinets de recrutement. ;)
 
Enfin cela donnera surement des idées à Jardy


Message édité par T509 le 24-06-2004 à 17:29:34

---------------
fermez vos topics résolus avec le tag [Résolu] en fin de titre. Merci !
n°777648
Profil sup​primé
Posté le 25-06-2004 à 11:30:35  answer
 

Excellent les gars !
Je vais regarder tout ça ... ainsi que la classe phpmailer ... merci

n°779088
Profil sup​primé
Posté le 26-06-2004 à 16:34:56  answer
 

J'ai fais mon script de mailing (parcours de la BD envoi à chaque tour ...) le gros problème c'est le problème du timeout ... je vais étudier le javascript de notre ami harrysauce. Avez vous d'autres idées ?

n°779305
Big-Foot
Posté le 26-06-2004 à 20:55:25  profilanswer
 

je propose de déjà remplacer le JS par une redirection http

n°779313
harrysauce
Miaaaooou!
Posté le 26-06-2004 à 21:05:28  profilanswer
 

Big-Foot a écrit :

je propose de déjà remplacer le JS par une redirection http

C'est possible mais à ce moment là y'a plus l'affichage des adresses auxquelles le mail a été envoyé (ou alors tout à la fin, mais de toute facon laisser une page blanche pendant toute la durée d'envoi des mails c'est pas top niveau ergonomie : y'a pleins de gens qui vont êtres tentés d'actualiser la page ne comprenant pas pourquoi rien ne s'affiche)...
 
Après ca dépend de l'utilisation, dans le cadre où j'ai fait ca c'était obligatoire....

mood
Publicité
Posté le 26-06-2004 à 21:05:28  profilanswer
 

n°779315
Big-Foot
Posté le 26-06-2004 à 21:10:01  profilanswer
 

d'un autre coté tu ne pourras pas envoyer tes mails sans avoir le js sur ta machine
edit: enfin si, en écrivant le liens sur la page je sais mais ca fait pas très classe...
Il n'y a qu'a mettre un avertissement avant l'envoie "ne pas refresher c'est long et c'est normal...", de toute facon les admin sont pas cons généralement


Message édité par Big-Foot le 26-06-2004 à 21:12:44
n°779318
harrysauce
Miaaaooou!
Posté le 26-06-2004 à 21:14:48  profilanswer
 

Big-Foot a écrit :

d'un autre coté tu ne pourras pas envoyer tes mails sans avoir le js sur ta machine
edit: enfin si, en écrivant le liens sur la page je sais mais ca fait pas très classe...
Il n'y a qu'a mettre un avertissement avant l'envoie "ne pas refresher c'est long et c'est normal...", de toute facon les admin sont pas cons généralement


Ca dépend pour qui tu fais ca  [:spamafote]  
Moi c'était pour l'envoi de newsletter d'une boutique en ligne.
Et l'administrateur c'est le commercant, et un commercant n'est pas forcément un informaticien accompli....
 
EDIT : et bien bon, ca devient rare les navigateurs qui gèrent pas le JS :o, et si jamais ca a été désactivé volontairement, le mec est assez intelligent pour le remettre, et puis encore une fois mon script était plus destiné au commercant de base qui ne sait même pas ce qu'est le JS [:spamafote]


Message édité par harrysauce le 26-06-2004 à 21:17:07
n°779320
Big-Foot
Posté le 26-06-2004 à 21:16:22  profilanswer
 

ouai c'est vrai, mais le js sera ici je pense plus problematique qu'une redirection http avec avertissement

n°779321
harrysauce
Miaaaooou!
Posté le 26-06-2004 à 21:21:27  profilanswer
 

Big-Foot a écrit :

ouai c'est vrai, mais le js sera ici je pense plus problematique qu'une redirection http avec avertissement

En cours on a toujours appris à ne jamais laisser une page blanche, faut toujours laisser un texte affiché à l'écran, c'est effarant ce que certains personnes peuvent êtres à la rue sur Internet...
 
Même si ma solution est la moins "propre" des deux, pour l'utilisateur final c'est la moins compliqué, et celle qui provoquera le moins d'erreurs...
 
Sinon une autre solution c'est avec des frames, une qui prend tout l'écran avec un message d'avertissement, et l'autre, invisible, qui envoi les mails, mais bon, les frames c'est pas super propre non plus...


Message édité par harrysauce le 26-06-2004 à 21:21:44
n°779924
Big-Foot
Posté le 28-06-2004 à 02:48:38  profilanswer
 

donc en résumé d'un coté t'as un système qui ne fonctionne de loin pas partout et de l'autre un système qui peut planter...
 
L'idée des frames c'est déja mieu que le js je pense mais c'est pas top...
 
On peut toujour imaginer un système de sessions qui enregistre les adresses des mails déjà envoyés. Et comme ca même si il y a un refresh de la part de l'utilisateur, le script reprend l'envoie là ou ils c'est arreté ;)


Message édité par Big-Foot le 28-06-2004 à 02:49:29
n°779932
harrysauce
Miaaaooou!
Posté le 28-06-2004 à 03:28:53  profilanswer
 

Big-Foot a écrit :

donc en résumé d'un coté t'as un système qui ne fonctionne de loin pas partout et de l'autre un système qui peut planter...
 
L'idée des frames c'est déja mieu que le js je pense mais c'est pas top...
 
On peut toujour imaginer un système de sessions qui enregistre les adresses des mails déjà envoyés. Et comme ca même si il y a un refresh de la part de l'utilisateur, le script reprend l'envoie là ou ils c'est arreté ;)

Oui, mais t'as toujours une page blanche pendant tout l'envoi des mails, et quoique t'en dises c'est encore plus crade que de mettre du JS [:spamafote]

n°780354
Big-Foot
Posté le 28-06-2004 à 12:41:53  profilanswer
 

c'est peut etre plus crade, mais en tout cas ca fonctionnera partout

n°784750
Profil sup​primé
Posté le 02-07-2004 à 12:57:32  answer
 

Oula vous avez discuté un max !
Heu déjà HarrySauce merci pour m'avoir donné ton code, j'essaye de le réutiliser mais pour la marge je prend combien ... et il me semble qu'il existe une fonction php qui permet de ramener le timeout des scripts du serveur oueb...
 
Merci

n°784816
T509
$job-&gt;GetJob(now)
Posté le 02-07-2004 à 13:40:38  profilanswer
 

oui cette fonction existe, mais elle n'est pas forcément dispo. Cela dépend de ton hébergeur. ini_set() est la fonction.
 
pour la marge, cela dépend de beaucoup de choses notamment le temps d'envoi d'un mail.


---------------
fermez vos topics résolus avec le tag [Résolu] en fin de titre. Merci !
n°785121
harrysauce
Miaaaooou!
Posté le 02-07-2004 à 16:26:59  profilanswer
 

Jardy a écrit :

Oula vous avez discuté un max !
Heu déjà HarrySauce merci pour m'avoir donné ton code, j'essaye de le réutiliser mais pour la marge je prend combien ... et il me semble qu'il existe une fonction php qui permet de ramener le timeout des scripts du serveur oueb...
 
Merci

Là c'est toi qui voit, moi j'avais mis 1 seconde, mais doit y avoir moyen de faire plus propre, genre 50% du temps d'envoi d'un mail, ou un truc du genre....

n°785147
T509
$job-&gt;GetJob(now)
Posté le 02-07-2004 à 16:44:47  profilanswer
 

Je vous plutôt 2 à 3 fois le temps max d'envoi d'un mail.
 
Ceci parce qu'après avoir envoyé le mail, on fait encore des choses. Si tu te connecte à une BDD, il faut aussi tenir compte de ce temps là ...
 
Par contre 1 sec, c'est la solution facile et "sûre"


---------------
fermez vos topics résolus avec le tag [Résolu] en fin de titre. Merci !
n°1092538
Profil sup​primé
Posté le 22-05-2005 à 16:58:36  answer
 

Désolé de réveiller ce post mais j'ai essayé d'autres choses de plus propres toujours avec la classe PHPMailer.
Un seul script php simple qui boucle les emails de sa BD en les ajoutant en AddBCC. Le problème c'est que je n'ai réussi à faire fonctionner le BCC en se connectant à un SMTP donc en utilisant la classe class.smtp.php, donc j'ajoute mes contacts en BCC (copie cachée) et je fais un seul envoi. La question con est la suivante, pourquoi je pars encore en timeout ...?
 
Je me suis beaucoup documenter sur le web mais je n'ai pas trouvé bcp de chose, cependant, je me demande si je ne vais pas mailer de mon propre ordinateur en y installant un serveur SMTP, le problème c'est que je ne sais pas très bien comment ça fonctionne. Je vais essayer de donner plus d'infos pour que cela soit utile à ceux qui voudront faire de même.
 
@ suivre ^_^

mood
Publicité
Posté le   profilanswer
 


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

  [PHP] Faire un script simple de mailing

 

Sujets relatifs
[PHP]Centrer une image de PreloadHTML et php passage de valeur
[PHP] récupérer les donnés d'un autre siteFormulaire et PHP
[MMORPG en PHP] World of bacterie.[PHP] test upload de fichier (resolu)
Problème de script... facile pour un connaisseur...[PHP] partager des données sans BDD
Methode sax vers un script sql[Erreur php] Undefined offset
Plus de sujets relatifs à : [PHP] Faire un script simple de mailing


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