[PHP] Faire un script simple de mailing

Faire un script simple de mailing [PHP] - PHP - Programmation

Marsh Posté le 24-06-2004 à 16:26:41    

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

Reply

Marsh Posté le 24-06-2004 à 16:26:41   

Reply

Marsh Posté le 24-06-2004 à 16:34:46    

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

Marsh Posté le 24-06-2004 à 16:42:18    

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
Reply

Marsh Posté le 24-06-2004 à 16:56:26    

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

Marsh Posté le 24-06-2004 à 17:23:05    

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
Reply

Marsh Posté le 24-06-2004 à 17:29:21    

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

Marsh Posté le 25-06-2004 à 11:30:35    

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

Reply

Marsh Posté le 26-06-2004 à 16:34:56    

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 ?

Reply

Marsh Posté le 26-06-2004 à 20:55:25    

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

Reply

Marsh Posté le 26-06-2004 à 21:05:28    

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

Reply

Marsh Posté le 26-06-2004 à 21:05:28   

Reply

Marsh Posté le 26-06-2004 à 21:10:01    

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
Reply

Marsh Posté le 26-06-2004 à 21:14:48    

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
Reply

Marsh Posté le 26-06-2004 à 21:16:22    

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

Reply

Marsh Posté le 26-06-2004 à 21:21:27    

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
Reply

Marsh Posté le 28-06-2004 à 02:48:38    

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
Reply

Marsh Posté le 28-06-2004 à 03:28:53    

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]

Reply

Marsh Posté le 28-06-2004 à 12:41:53    

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

Reply

Marsh Posté le 02-07-2004 à 12:57:32    

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

Reply

Marsh Posté le 02-07-2004 à 13:40:38    

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

Marsh Posté le 02-07-2004 à 16:26:59    

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

Reply

Marsh Posté le 02-07-2004 à 16:44:47    

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

Marsh Posté le 22-05-2005 à 16:58:36    

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 ^_^

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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