Problème envoi mails multiples

Eléphant du PHP | 153 Messages

22 déc. 2006, 10:26

Bonjour à tous,

En me référent à divers post concernant ce sujet, j'ai un petit code qui envoie un une donnée à certains membres par email (maxi une trentaine en même temps et une fois par jour).

(J'ai enlevé les noms des champs et modifié certaines choses :wink: )
if (isset($_POST["envoi"])) 
	{ // envoi par email
		
		$nb_email = 10;
		for ($i=1; $i <= $nb_email; $i++) 
		{	 
			$sq = "SELECT * FROM m WHERE champ = '$val' ORDER BY champ2 ASC";
			$res = mysql_query($sq) or die (mysql_error());
// Jusqu'ici, pas d'erreur retournée
			
			while ($row = mysql_fetch_array($res))
			{
				$headers  = "From: \"***\"<webmaster@***.com>\n";
  				$headers .= "Reply-To: ***@***.com\n";
  				$headers .= "Bcc: webmaster@***.com\n";
  				$headers .= "X-Priority: 1\n";
  				$headers .= "Content-Type: text/plain; charset=\"iso-8859-1\"\n";
  				$headers .= "Content-Transfer-Encoding: 8bit";

  				$sujet  = 'Sujet'.$row[4];

  				$message  = "Bonjour ".$row[1].", \n\n";
  				$message .= "message1 ".$row[6].".\n";
  				$message .= "Pour ".$row[5].".\n";
  				$message .= "message2 ".$row[7]." €.\n";
  				$message .= "message3 : ".$row[8].".\n";
  				$message .= "message4 : ".$row[9].".\n";
  				$message .= "message5 : ".$row[10].".\n";
  				$message .= "message7 : ".$row[11].".\n\n";
  				$message .= "message8 : ".$row[3].".\n\n";
  				$message .= "message9\n\n";
  				$message .= "Je vous souhaite une bonne réception.\n";
  				$message .= "Cordialement\n";
  				$message .= "*** - Administrateur du site ***";

				// On envoi l’email 
    				$mail = mail($row[2], $sujet, $message, $headers); 
        		}
		}
		// messages après exécution
		if (!$res)
		{
			echo "Problème res !<br>";
		}
		else
		{
			echo "Pas de problème avec res !  <br>";  // retour ok, pas d'erreur
		}
		if (!$mail)
		{
			echo "Les codes n'ont pas été envoyés !";  // erreur retournée
		}
		else
		{
			echo "Les codes ont bien été envoyés !";
		}
		if ($resucode AND $mail)
		{
			$upd = "UPDATE membres SET envoi_r = 'oui' WHERE produit_id = '" .$rowc[0]. "' ";
			$rupd = mysql_query($upd);
		}
		
	}	
Donc, les emails ne sont pas envoyés. Si vous pouviez m'aider, merci :D

D'autre part, suite à chaque envoi d'un email, je voudrais faire un update "$upd" sur le membre correspondant dans la table. Je pense qu'il faudrait mettre la requête dans le while, mais est-ce la bonne solution ?

Meri par avance pour votre aide. :D

Eléphanteau du PHP | 32 Messages

22 déc. 2006, 10:59

Déja ton test n'est pas bon , à titre d'exemple si les 9 premiers envoie s'effectuent correctement mais que le 10 ème ne passe pas , ca te diras qu'il y a eu une erreur.

En gros ta varaible "$mail" contient le résultat du dernier appel à la commande mail.

Sinon le code m'a l'air correct , regarde dans tes logs si l'erreur ne viens pas d'ailleurs (maillog etc.. ) .

Eléphant du PHP | 153 Messages

22 déc. 2006, 11:07

Bonjour fgranjon,

Donc, comment dois-je m'y prendre pour le test de $mail ?
De toute façon, aucun mail n'a été envoyé, puisque aucun n'a été reçu.

Et pour les logs, où puis-je trouver cela ?

Merci.

Eléphanteau du PHP | 32 Messages

22 déc. 2006, 14:33

Bonjour ,

Alors un première vue t'as boucle for ne te sert à rien à part si tu cherches à spammer les utilisateurs issues de ta base de donnée.

Ensuite , tu peux commencer ainsi
ps) au passage $val , sort d'ou ?
$sq = "SELECT * FROM m WHERE champ = '$val' ORDER BY champ2 ASC";
$res = mysql_query($sq) or die (mysql_error());

//parcourt des résultats de la requète
while ($row = mysql_fetch_array($res)) { 

      //envoie d'un mail
      if (envoie_mail($row)) {
          //ici tu peux envisager un update
          echo "Réussi !<br>";
      } else {
          //ici il y a eu une erreur dans l'envoie
          echo "Erreur!<br>";
      }

}

function envoie_mail($data) {

   $headers="tes headers";
   $message="ton message";
   $sujet="ton sujet";
   $dest=$data[2] ; //<="ton destinataire";
   echo "Envoie d'un mail à $dest :";
   return mail($dest, $sujet, $message, $headers); 
}

Mais assure toi avant tout que tu a bien les bonnes informations , du style le destinataire etc ....

Eléphant du PHP | 153 Messages

22 déc. 2006, 15:14

Oups, désolé, j'ai travaillé sur le code entre temps et ça fonctionne ! :D

En faite, j'avais fait une erreur sur ma requête "$sq" ce qui fait que mes variables étaient vident :roll:

Ensuite, j'ai retiré la boucle "for" (même conclusion que toi sur son utilité).

Bref ça fonctionne.

Par contre, j'aurais souhaité un rapport sur chaque envoi, du type :

Une table avec 2 colonnes " email membre/envoyé "
et à chaque envoi une ligne avec l'email du membre et Envoyé ou Non envoyé.

Par rapport à ton code, puis-je insérer cela au niveau de "//envoie d'un mail" et de quelle manière dois-je m'y prendre, stp ?
Est-ce faisable et n'est-ce pas trop lourd à gérer pendant un envoi ?

Merci pour ton aide :D

Eléphanteau du PHP | 32 Messages

22 déc. 2006, 15:23

Tout dépends de combien tu va envoyer de mails , car pour un envoi de mail tu auras un enregistrement/requete .Certains herbergeurs limitent le nombre de requetes par mois.

Sinon 2 options:

1) à chaque fois que tu envois un mail tu fais une insertion dans la base de donnée , dans ce cas la ca serait davantage un log que tu aurais et je te conseillerai alors d'ajouter la date/heure dans ta table.
$sq = "SELECT * FROM m WHERE champ = '$val' ORDER BY champ2 ASC";
$res = mysql_query($sq) or die (mysql_error());

//parcourt des résultats de la requète
while ($row = mysql_fetch_array($res)) { 

      //envoie d'un mail
      if (envoie_mail($row)) {
          //ici tu peux envisager un update
          mysql_query("insert into logs values (now(),'{$row[2]}','Réussi')");
          echo "Réussi !<br>";
      } else {
          //ici il y a eu une erreur dans l'envoie
          mysql_query("insert into logs values (now(),'{$row[2]}','Echec')");
          echo "Erreur!<br>";
      }

} 
2) à chaque fois que tu envoies tu viens mettre à jour l'enregistrement pour le membre concerné (eventuellement tu fais un insert si aucun enregistrement pour ce membre existe)
$sq = "SELECT * FROM m WHERE champ = '$val' ORDER BY champ2 ASC";
$res = mysql_query($sq) or die (mysql_error());

//parcourt des résultats de la requète
while ($row = mysql_fetch_array($res)) { 

      //envoie d'un mail
      if (envoie_mail($row)) {
          //ici tu peux envisager un update
          mysql_query("replace into logs ('{$row[2]}','Réussi')");
          echo "Réussi !<br>";
      } else {
          //ici il y a eu une erreur dans l'envoie
          mysql_query("replace into logs ('{$row[2]}','Echec')");
          echo "Erreur!<br>";
      }

} 

Eléphant du PHP | 153 Messages

22 déc. 2006, 16:07

Vu que j'ai déja la table, je vais faire le 2° :wink:

Je te remercie pour ton aide très efficace :D
Et je clos ce topic.