problème avec mail de masse

Eléphant du PHP | 246 Messages

26 nov. 2005, 19:25

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

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

26 nov. 2005, 19:40

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:

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 246 Messages

26 nov. 2005, 20:33

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 ?

ViPHP
ViPHP | 1380 Messages

26 nov. 2005, 20:43

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
ripat

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

26 nov. 2005, 20:48

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:

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 246 Messages

26 nov. 2005, 20:58

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

Administrateur PHPfrance
Administrateur PHPfrance | 149 Messages

26 nov. 2005, 22:01

PEAR::MAIL et ses sous package gère vraiment très bien ca.


surtout mail_queue
--
Moosh - ancêtre de la communauté
http://www.phpfrance.com

ViPHP
ViPHP | 1380 Messages

27 nov. 2005, 10:26

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
ripat

Eléphant du PHP | 246 Messages

02 déc. 2005, 20:42

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 ?

Eléphant du PHP | 246 Messages

02 déc. 2005, 23:09

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

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

03 déc. 2005, 01:33

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.

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

ViPHP
ViPHP | 1380 Messages

03 déc. 2005, 09:21

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
ripat

Eléphant du PHP | 246 Messages

03 déc. 2005, 20:41

Merci...mais cest encore trop compliqué pour moi...donc je vais pas esssayé plus loin memem si cest plus pratique...

Outamitetong
Invité n'ayant pas de compte PHPfrance

09 déc. 2005, 18:17

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

Eléphant du PHP | 246 Messages

10 déc. 2005, 15:12

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