Page 1 sur 2

problème avec mail de masse

Posté : 26 nov. 2005, 19:25
par Nico128
Salut tout le monde...j'ai un problème pour les mail de masses, quand je veux en encoyé plus de 1'000 ca foire dlja, je recois un message disant no faling folow (truc du style) pour me dire que ca na pas été envoyé.

alors je voudrais créé mon propre script, qui va envoyé d'abord un mail de l'id 1 à 100, puis un autre mail de 101 à 200, etc. En résumé, jaimerais trancher le bcc

j'ai une ptite idée de comment faire, mais surement que je me complique la vie...j'ai déja commencé a prendre les email de 1 à 100
$db = mysql_connect('localhost', 'xxxxxx', 'xxxxx');
mysql_select_db('xxxxxx',$db);
$sql = 'SELECT user_email FROM phpbb_users LIMIT 0,100';
$req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());

while($data = mysql_fetch_assoc($req))
    {
    // on affiche les informations de l'enregistrement en cours
    echo $data['user_email'].' ';
    }

mysql_close(); 
Après j'aimerais pouvoir envoyer l'email :
$to .= "<[email protected]>; <[email protected]>";
$subject = 'le titre';
$message = 'le texte';
$headers  = "MIME-Version: 1.0\r\n";
$headers .= "Content-type: text/html; charset=iso-8859-1\r\n";
$headers .= "From: monsite.com <[email protected]>\r\n";
mail($to, $subject, $message, $headers);
Pour la première variable $to, je sais pas quoi mettre pour que se soit toutes les adresse de 1 à 100

sinon j'ai une autre solution, ca serait d'envoyer un mail à chaque enregistrement trouvé (je mets la fonction mail dans la boucle), mais si il execute 100x cette fonction, ca risque pas de faire ramer ?

voila, merci d'avance

Posté : 26 nov. 2005, 19:40
par Truc
SAlut, il y a deja quelques topic a ce sujet sur le forum encore faut -il chercher :wink: ICI

de plus la clause Limit ne convient pas dans ce cas, sinon tu sera obligé de refaire une requete pour avoir les 101-200 suivant et ainsi de suite :?

un compteur dans la boucle est bien mieux :wink:

Posté : 26 nov. 2005, 20:33
par Nico128
Ah merci ! J'ai fait une recherche, ya pas mal de personnes qui ont ce problème, mais pas beaucoup l'ont entièrement résolu.

J'ai vu qu'il y avait la fonction sleep() pour faire une pause, cest bien je la conaissais pas :P

J'ai une autre solution...
$db = mysql_connect('localhost', 'xxxxxx', 'xxxxx');
mysql_select_db('xxxxxx',$db);
$sql = 'SELECT user_email FROM phpbb_users';
$req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());

while($data = mysql_fetch_assoc($req))
    {
    // on affiche les informations de l'enregistrement en cours
    $to .= $data['user_email'];
    $subject = 'le titre';
    $message = 'le texte';
    $headers  = "MIME-Version: 1.0\r\n";
    $headers .= "Content-type: text/html; charset=iso-8859-1\r\n";
    $headers .= "From: monsite.com <[email protected]>\r\n";
    mail($to, $subject, $message, $headers);

    sleep(1);

    }

mysql_close();
En principe ça devrais marcher ? Mais bon cest un peu lent...pour 2'000 envoie il faudra patientez 2'000sec, soit 35mn

Et je conais pas le compteur, comment s'utilise-til ?

Posté : 26 nov. 2005, 20:43
par Ripat
La fonction mail() n'est pas du tout appropriée pour des mailing de masse. A chaque passage dans la boucle, on ouvre et on referme un socket.

Pas terrible pour les performances!

Beaucoup mieux et fait pour ça: http://pear.php.net/package/Mail

Posté : 26 nov. 2005, 20:48
par Truc
le compteur c'est une facon de parler :wink:
<?
$db = mysql_connect('localhost', 'xxxxxx', 'xxxxx');
mysql_select_db('xxxxxx',$db);
$sql = 'SELECT user_email FROM phpbb_users';
$req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());

$compteur=0; // <= compteur ;)

while($data = mysql_fetch_assoc($req))
    {
       // on affiche les informations de l'enregistrement en cours
       $to .= $data['user_email'];
       $subject = 'le titre';
       $message = 'le texte';
       $headers  = "MIME-Version: 1.0\r\n";
       $headers .= "Content-type: text/html; charset=iso-8859-1\r\n";
       $headers .= "From: monsite.com <[email protected]>\r\n";
       mail($to, $subject, $message, $headers);

       if($compteur == 50)
       {
			sleep(1);
			$compteur=0;
       }
       $compteur++;
    }
mysql_close();
moins de perte en temps deja :wink:

Posté : 26 nov. 2005, 20:58
par Nico128
Très bonne idée ! Fallait y penser :D

pour Ripat j'ai déja vu sa sur d'autres posts, j'ai télécharger juste pour voir ce que c'est, déja cest de l'anglais mais le pire je sait meme pas ce que cest ^^

j'ai pu comprendre que cest pour le smtp, ou qqch du style ? Si tu pouvais m'expliquer son fonctionement ca serait sympa :D

merci

Posté : 26 nov. 2005, 22:01
par Moosh
PEAR::MAIL et ses sous package gère vraiment très bien ca.


surtout mail_queue

Posté : 27 nov. 2005, 10:26
par Ripat
Très bonne idée ! Fallait y penser :D

pour Ripat j'ai déja vu sa sur d'autres posts, j'ai télécharger juste pour voir ce que c'est, déja cest de l'anglais mais le pire je sait meme pas ce que cest ^^

j'ai pu comprendre que cest pour le smtp, ou qqch du style ? Si tu pouvais m'expliquer son fonctionement ca serait sympa :D

merci
La doc est même en français : http://pear.php.net/manual/fr/package.m ... .intro.php

Posté : 02 déc. 2005, 20:42
par Nico128
Merci, mais j'y comprend rien du tout :shock:

C'est a nous de créer le script ? quand on la télécharger il faut modifier quoi ?

Posté : 02 déc. 2005, 23:09
par Nico128
J'ai essayé de mettre ça mais ya un ptit poblème....

voila le code
					<?
$db = mysql_connect('localhost', 'xxxxx', 'xxxxxxx');
mysql_select_db('xxxxxx',$db);
$sql = 'SELECT user_email FROM phpbb_users';
$req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());

$compteur=0; // <= compteur Wink

while($data = mysql_fetch_assoc($req))
    {
       // on affiche les informations de l'enregistrement en cours
       $to .= $data['user_email'];
       $subject = $_POST['titre'];
       $message =  nl2br($_POST['texte']);
       $headers  = "MIME-Version: 1.0\r\n";
       $headers .= "Content-type: text/html; charset=iso-8859-1\r\n";
       $headers .= "From: legend-nintendo.com <[email protected]>\r\n";
       mail($to, $subject, $message, $headers);

       if($compteur == 50)
       {
            sleep(1);
            $compteur=0;
       }
       $compteur++;
    }
mysql_close();
?>
J'ai envoyé un message, mon adresse email la bien recu, c'est la 1er étant donné que je suis admin

Mais après jai ressu plein de mail de postmaster :
The following addresses had permanent fatal errors -----
[email protected]@[email protected]@[email protected]@hotmail.com
Je comprend pas pourquoi les email sont coller ensemble...

J'ai recu 79 mail comme ça...pour 2171 membres

Posté : 03 déc. 2005, 01:33
par Truc
je ne suis pas le mieux placé pour te parler de pear alors je ne peux te conseiller plus que ça...

mais en ce qui concerne ton code tu concatènes l'ancienne adresse mail a la nouvelle a chaque tour de boucle. Il faut enlever le point qui est devant le =
$to .= $data['user_email'];
a savoir aussi que tu peut envoyer plusieurs mail a la fois avec une virgule entre les adresses mail, puis envoyer par paquet. Encore une fois c'est la fonction mail() n'est pas la meilleure.

Posté : 03 déc. 2005, 09:21
par Ripat
La syntaxe de Pear est assez simple. Il faut, bien sûr installer la petite librairie Pear. Ensuite, voici le genre de code pour envoyer un même mail à toute une liste de destinataires en n'ouvrant qu'une connexion smtp:
include('Mail.php'); // classes Pear

$recipients = '[email protected], [email protected], [email protected], [email protected]';

$headers['From']    = '[email protected]';
$headers['To']      = $recipients;
$headers['Subject'] = 'Message TEST';
    
$body = 'Bonjour !';

$params['host'] = 'ton.host.fr';
    
$mail_object =& Mail::factory('smtp', $params);

$mail_object->send($recipients, $headers, $body);
Et c'est tout!

D'autres exemples:
http://www.hudzilla.org/php/15_5_3.php

Posté : 03 déc. 2005, 20:41
par Nico128
Merci...mais cest encore trop compliqué pour moi...donc je vais pas esssayé plus loin memem si cest plus pratique...

Posté : 09 déc. 2005, 18:17
par Outamitetong
Bonjour everybody,

Nico128, j'ai les mêmes besoin que toi, j'ai une liste de 1000 mails environ et je dois envoyer une niouzeletter au format html à toutes ces personnes, je ne comprends pas tout au php, je suis plutôt graph' moua.

Est-ce que tu t'en es sorti avec ton code ? :D

Merci d'avance

Posté : 10 déc. 2005, 15:12
par Nico128
Salut ! Oui je m0en suis sorti...pas de la meilleur facon mais ca marche quand meme...

J'ai créé une page avec le formulaire :

Code : Tout sélectionner

<form name="form" method="post" action="email-ok"> <table width="59%" cellpadding="0" cellspacing="0" border="0"> <tr> <td><br> <input name="titre" type="text" value="" size="100"> <br> <br> <textarea name="texte" cols="75" rows="20"></textarea></td></tr> </table> <br> <input type="submit" name="Submit" value="Envoyer"> <br> </form>
Puis une page apeler "email-ok.php" et jai mis le code :
					<?
$db = mysql_connect('localhost', 'login', 'mdp');
mysql_select_db('la base de donné',$db);
$sql = 'SELECT user_email FROM phpbb_users';
$req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());

$compteur=0; // <= compteur Wink

while($data = mysql_fetch_assoc($req))
    {
       // on affiche les informations de l'enregistrement en cours
       $to = $data['user_email'];
       $subject = $_POST['titre'];
       $message =  nl2br($_POST['texte']);
       $headers  = "MIME-Version: 1.0\r\n";
       $headers = "Content-type: text/html; charset=iso-8859-1\r\n";
       $headers = "From: legend-nintendo.com <[email protected]>\r\n";
       mail($to, $subject, $message, $headers);

       if($compteur == 50)
       {
            sleep(1);
            $compteur=0;
       }
       $compteur++;
    }
mysql_close();
?>
Pour toi, oublie pas de faire quelques modifs. Par example le lien action="" du formulaire, il faut mettre le lien de la page qui contient le php.

Pour la page en php, n'oublie pas de mettre tes infos pour se connecté a la base de donné. Si ton forum utilise un autre prefixe que phpbb_ fait aussi le changement.

Voilà, tient moi au courant si ca marche

Ah oui, et en bas dans la fonction mail() change aussi le "from : legend-nintendo.com........" par ton site et ton email