probleme envoi plusieurs mail

etc57
Invité n'ayant pas de compte PHPfrance

26 mai 2008, 12:58

Bonjour,

Je vous présente ma fonction demailing de newletter, qui mail a partir d'un groupe d'utilisateur défini par l'expéditaire.

quand il n'y a que 1 destinataire, la fonction marche parfaitement
des que je passe a 2 elle bug
donc je ne comprend pas ce qui fait que ca ne marche pas des qu'on a plus d'un destinataire.

$sql = "SELECT * FROM newsletters WHERE newsletter_id=".$id."";	
$result = mysql_query($sql);
$var = mysql_fetch_array($result);
		
		$sql2 = "SELECT * FROM users WHERE users_group IN($listgroups) AND users_newsletter=1";
		$result2 = mysql_query($sql2);
		$nbligne=mysql_num_rows($result2);
		
		for ($i=1;$i<=$nbligne;$i++)
		{
		$ligne=mysql_fetch_array($result2);
		$civiliteMail=$ligne["users_civilite"];
		$nomMail=htmlentities($ligne["users_lastname"]);
		$prenomMail=htmlentities($ligne["users_name"]);
		$mailMail=$ligne["users_email"];
		$commercial=htmlentities($ligne["commercial"]);
		$nomduguguss="$civiliteMail $nomMail $prenomMail";
		
		

$email_expediteur='[email protected]';
$email_reply='[email protected]';

$message_texte ='Bonjour, '.$nomduguguss."\n".'';
id='.$id;
$destinataire = $mailMail;

$sujet ='Newsletter Leaseplan';


$frontiere = '-----=' . md5(uniqid(mt_rand()));


$headers = 'From: "Leaseplan" <'.$email_expediteur.'>'."\n";
$headers .= 'Return-Path: <'.$email_reply.'>'."\n";
$headers .= 'MIME-Version: 1.0'."\n";
$headers .= 'Content-Type: multipart/alternative; boundary="'.$frontiere.'"';

$fichier = 'This is a multi-part message in MIME format.'."\n\n";
$fichier .= '--'.$frontiere."\n";
$fichier .= 'Content-Type: text/plain; charset="iso-8859-1"'."\n";
$fichier .= 'Content-Transfer-Encoding: 8bit'."\n\n";
$fichier .= $message_texte."\n\n";

$fichier .= '--'.$frontiere."\n";
$fichier .= 'Content-Type: text/html; charset = \"iso-8859-1"'.\"\n"; 
$fichier .= 'Content-Transfer-Encoding: quoted-printable'."\n\n"; 

$fichier .= '<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\"><html><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Newsletter</title>
<style type="text/css">
<!--
liste des styles ....
-->
</style>
</head>

<body marginheight="0" marginwidth="0" leftmargin="0" topmargin="0">
<table width="740" border="0" cellspacing="0" cellpadding="0">
<tr>
    <td colspan="2" height="152" background="../newsletter/img/header.jpg">&nbsp;</td>
</tr>
<tr>
<td align="center" valign="top"><br>
<br>
<table width="400" border="0" cellspacing="0" cellpadding="0"><tr>
<td align="left"><span class="presentation2">';
$temp = str_replace("<","<",$nomduguguss);
$fichier .= 'Bonjour,' .stripslashes($temp);
$fichier .='</span><br></td></tr><tr><td align="left"><span class="presentation">';
$temp = str_replace("<","<",$commercial);
$fichier .= 'Commercial : ' .stripslashes($temp);
$fichier .='</span><br></td></tr><tr><td align="right">

<br><br><p><span class="newsletter">';

$temp = str_replace("<","<",$var['newsletter_nom']); 
$temp = str_replace(">",">",$temp);
$temp = str_replace("&","&",$temp);
$fichier .= stripslashes($temp);

$fichier .='</span><br><span class="date">';

$fichier .= date( 'd.m.Y',$var['newsletter_date']);

$fichier .='</span></p></td></tr><tr><td width="400"><p align="justify" class="texte" style="margin:10px">';

$temp = str_replace("<","<",$var['newsletter_texte']); 
$temp = str_replace(">",">",$temp);
$temp = str_replace("&","&",$temp);
$fichier .= stripslashes($temp);



$fichier .= ' <p><br>
    </p>
    </td></tr>
  <tr>
    <td height="62" colspan="2" class="fondorange"><p class="blanc" style="margin:10px">&nbsp;<br>
      &nbsp;</p></td>
  </tr>
</table>
</body>
</html>';


mail($destinataire,$sujet,$fichier,$headers);

}

Si vous pouvez m'eclairer sur les raisons

merci d'avance

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

26 mai 2008, 13:02

ça veut dire quoi "elle bug" ???

etc57
Invité n'ayant pas de compte PHPfrance

26 mai 2008, 13:15

le mail au premier utilisateur de la liste est envoye

ensuite il semble que le script s'arrete et j'obtiens une page blanche

lors de l'execution quand il n'y a que 1 destinataire, la requete s'execute en genre 0.5s

des que je passe a 2 utilisateur, la requete mets 10s a s'executer et seul le premier destinataire recoit le mail avant l'erreur.

Eléphant du PHP | 422 Messages

26 mai 2008, 13:34

POur déterminer où est le problème, commence par le décomposer.
Fais juste une boucle du type
 for ($i=1;$i<=$nbligne;$i++) {
  $sujet ="Newsletter $i";
  $body ="Test $i";
  mail($destinataire[$i],$sujet,$fichier,$headers); 
}
Ensuite, sors de ta boucle tout ce qui n'a pas besoin d'être positionné à chaque fois. Du type ce n'est pas la peine de faire 50 fois $expediteur = "[email protected]"

etc57
Invité n'ayant pas de compte PHPfrance

26 mai 2008, 13:39

je viens de m'apercevoir que le probleme venait du corps de mon corps de message ( la partie $ fichier )

quand je la change les mail s'envoie aux 2 personnes.

JE ne comprend pas comment le bug peut venir de la car si il y avait un souci cela ne devrait pas m'envoyer le 1 mail non ?

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

26 mai 2008, 14:01

<mode a moitié HS>
$nomdugugus
J'espère pour toi que tu ne feras jamais l'oubli du $ ...
Je ne pense pas que j'apprécierais de recevoir un mail avec "nomdugugus" en entête :?
</mode>
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 422 Messages

26 mai 2008, 14:20

Personnellement, je mettrais le corps HTML de l'email dans un fichier externe avec des NOM_EXPEDITEUR et des NOM_EXPEDITEUR.
Puis, mon programme lirait ce fichier externe et dans la boucle d'envoi, je ne ferais juste que des remplacements des NOM_EXPEDITEUR et NOM_EXPEDITEUR par leurs valeurs.

@Zeus : je m'étais fait exactement la même remarque. :roll: Savoir qu'on est des gugusses potentiels pour l'une des principales agences de com lorraine, c'est moyen moyen ... Ne pas oublier Google et le fait qu'un jour, quelqu'un en tapant lorweb tombera sur cette page !

ViPHP
ViPHP | 2291 Messages

26 mai 2008, 17:29

Salut,

A première vue il faudrait peut-être déjà demander a MySQL de te retourner un message en cas d'erreur :arrow:
Un truc du genre
mysql_query($sql) or die('Erreur SQL !'.$sql.'<br />'.mysql_error());
Puis il y aurais bien ceci :
sql = "SELECT * FROM newsletters WHERE newsletter_id=".$id.""; 
Correction :?:
$sql = "SELECT * FROM newsletters WHERE newsletter_id=".$id.""; 
$nomduguguss="$civiliteMail $nomMail $prenomMail"; 
Correction
$nomduguguss=$civiliteMail . $nomMail . $prenomMail; 
id='.$id;
Correction je suppose :oops:
Mais je comprend pas se que cela fait là :?:
$id=$id;
Et pour finir
$temp = str_replace("<","<",$nomduguguss); 
$fichier .= 'Bonjour,' .stripslashes($temp); 
$fichier .='</span><br></td></tr><tr><td align="left"><span class="presentation">'; 
$temp = str_replace("<","<",$commercial); 
$fichier .= 'Commercial : ' .stripslashes($temp); 
$fichier .='</span><br></td></tr><tr><td align="right"> 

<br><br><p><span class="newsletter">'; 

$temp = str_replace("<","<",$var['newsletter_nom']);  
$temp = str_replace(">",">",$temp); 
$temp = str_replace("&","&",$temp); 
$fichier .= stripslashes($temp); 

$fichier .='</span><br><span class="date">'; 

$fichier .= date( 'd.m.Y',$var['newsletter_date']); 

$fichier .='</span></p></td></tr><tr><td width="400"><p align="justify" class="texte" style="margin:10px">'; 

$temp = str_replace("<","<",$var['newsletter_texte']);  
$temp = str_replace(">",">",$temp); 
$temp = str_replace("&","&",$temp); 
$fichier .= stripslashes($temp); 


Correction
$temp = str_replace("<","<",$nomduguguss); 
$fichier .= 'Bonjour,' .stripslashes($temp); 
$fichier .='</span><br></td></tr><tr><td align="left"><span class="presentation">'; 
$temp .= str_replace("<","<",$commercial); 
$fichier .= 'Commercial : ' .stripslashes($temp); 
$fichier .='</span><br></td></tr><tr><td align="right"> 

<br><br><p><span class="newsletter">'; 

$temp .= str_replace("<","<",$var['newsletter_nom']);  
$temp .= str_replace(">",">",$temp); 
$temp .= str_replace("&","&",$temp); 
$fichier .= stripslashes($temp); 

$fichier .='</span><br><span class="date">'; 

$fichier .= date( 'd.m.Y',$var['newsletter_date']); 

$fichier .='</span></p></td></tr><tr><td width="400"><p align="justify" class="texte" style="margin:10px">'; 

$temp .= str_replace("<","<",$var['newsletter_texte']);  
$temp .= str_replace(">",">",$temp); 
$temp .= str_replace("&","&",$temp); 
$fichier .= stripslashes($temp); 


Avec un peu de chance qui sait :wink:

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

26 mai 2008, 17:53

C'est sympa de ta part dunbar, mais il vaut mieux l'aider à comprendre que corriger à sa place ;)

Sinon :
$nomduguguss="$civiliteMail $nomMail $prenomMail";
se remplace plutôt par :
$nomduguguss=$civiliteMail .' '. $nomMail .' '. $prenomMail;
pour garder les espaces
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

ViPHP
ViPHP | 2291 Messages

26 mai 2008, 18:53

Sinon :
$nomduguguss="$civiliteMail $nomMail $prenomMail";
se remplace plutôt par :
$nomduguguss=$civiliteMail .' '. $nomMail .' '. $prenomMail;
pour garder les espaces
Ah..... oui les espaces j'ai oublier :oops: sorry :wink:

etc57
Invité n'ayant pas de compte PHPfrance

27 mai 2008, 09:19

je vous remercie tous de votre aide, qui ma aidé a trouvé mon problème et le coriger