Envoi de mail() dans une boucle.

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Envoi de mail() dans une boucle.

Re: Envoi de mail() dans une boucle.

par Cyrano » 10 juin 2011, 23:55

...et j'ai copié ce code sans réfléchir...
Je t'accorde le bénéfice de la franchise, comme j'aimerais que tous les débutants en fassent autant et que certains « prétendus » confirmés prenne ça en exemple à leur profit en premier lieu et au profit de tous en général.

On ne conçoit pas une application n'importe comment, ça demande de l'attention, de la précision et de la rigueur. Si tu te relâche ne serait-ce qu'un instant, tu risques de voir s'écrouler pas mal de choses.

Autre détail qui pourrait t'aider, ça me sert de signature sur un autre forum : « Une question bien posée, c'est un problème correctement compris, ça représente déjà 75% de la réponse »
En d'autres termes : on ne voit pas ton code, on ne sait pas ce que tu testes, on n'a aucune idée de ce qui s'affiche sur ton moniteur : comment peut-on espérer t'apporter une réponse pertinente si on ne sait pas de quels éléments on doit partir ?

:-*

Re: Envoi de mail() dans une boucle.

par moogli » 10 juin 2011, 20:23

Ok avec ta remarque pour la date, mais je me suis servi de ça pour coller avec la base de donnée, et j'ai copié ce code sans réfléchir.
:/

si tu pouvais fournir le dernier code testé complet on pourrait peut être plus t'aider ;)


@+

Re: Envoi de mail() dans une boucle.

par Al PiGiNo » 10 juin 2011, 09:38

Dans ton code je ne vois pas la fonction mail. Ne manquerait il pas encore du code ?
Décidément ...
La ligne avait sauté lors du copié/collé.
Ok avec ta remarque pour la date, mais je me suis servi de ça pour coller avec la base de donnée, et j'ai copié ce code sans réfléchir.
Je jetterais un œil sur ces classes, merci.

Re: Envoi de mail() dans une boucle.

par moogli » 09 juin 2011, 20:20

salut,

Dans ton code je ne vois pas la fonction mail. Ne manquerait il pas encore du code ?

coté code tout court
<?php
$query_date='SELECT CURDATE()';
$req=mysql_query($query_date);
$date=mysql_result($req, 0);
?>
c'est un peu abusé alors que tu a la même chose (au format français si tu le souhaite avec la fonction date de php.
<?php
$date = date('d-m-YT');
?>
plus rapide, moins de ressource d'utilisé et plus clair :)

Pour les saut de ligne dans tes textes, si tu souhaite les conserver autant ajouter des \n entres des " ( "\n\n" == deux sauts de lignes par exemple).

quand reste je ne sais je suppose que la logique est bonne vu que je ne connais pas ta lib.

les classes indiquées dans mon 1er mail ont pas mal d'exemple et pour un mail "simple" comme ceux que tu souhaite envoyer, sont relativement facile d'accès.

pour ce qui est du délais ou de l'urgence, ben si tu me paie pour faire fonctionner ton site je veux bien y passer la nuit :)


@+

Re: Envoi de mail() dans une boucle.

par Al PiGiNo » 09 juin 2011, 18:00

Ta remarque est pertinente Cyrano, et je m'excuse pour ceci.
J'ai arranger le code au début, j'espère que ça ira.

Re: Envoi de mail() dans une boucle.

par VaN » 09 juin 2011, 17:28

Ca ne serait pas parce que ton $i=$i+1; est en dehors du while() { } par hasard ?

Re: Envoi de mail() dans une boucle.

par Cyrano » 09 juin 2011, 17:16

Tu n'as pas le sentiment vague qu'il y a un problème ? Si personne ne répond, il y a peut-être une raison à ça.

Pour ma part, je t'ai fait remarquer un détail, tu as donné une réponse partielle, mais il eut été peut-être plus futé de remettre ton code en l'affichant correctement et en utilisant la barre d'outil qui comporte un bouton [php] pour conserver la mise en forme et une coloration syntaxique.

Si tu veux de l'aide, donne nous les éléments appropriés.

Je voudrais quand même aussi te faire observer que tes délais ne nous intéressent pas des masses. Tu es sur un forum ou ne sont présent que des bénévoles qui sont disposés à partager leur savoir : donne toi une chance d'obtenir de l'aide en évitant les arguments de type « urgence » et en affichant un code qui ne soit pas de « la soupe » : pour l'instant, je n'ai honnêtement pas envie de lire ton code parce qu'il faudrait que je passe d'abord du temps à réaligner tout ça pour commencer à le comprendre.

À toi la main, re-poste ton code et explique ce qui coince, ce que tu as tenté pour corriger, le résultat obtenu, les messages d'erreur, bref, tous les indices susceptibles de nous permettre de pointer rapidement l'erreur et de te l'indiquer.

Re: Envoi de mail() dans une boucle.

par Al PiGiNo » 09 juin 2011, 17:05

UP c'est très important et il ne me reste que 24h pour résoudre ce problème

Re: Envoi de mail() dans une boucle.

par Al PiGiNo » 08 juin 2011, 17:01

Désolé du retard je vais prendre le temps de vous répondre.

@Cyrano : non, je n'ai pas de problème d'accolades, ces accolades ferment autre chose et j'ai juste oublier de les enlever

@Mazarini : le mail est très bien envoyé avec toute les données pour la personne concernée

@AB : nous avons l'offre la plus importante, et il n'y aura JAMAIS plus de 900 mails à la fois (ce qui est irréaliste tout de même, il faudrait que tous les commerçant de France passent commande en même temps

@moogli : j'ai lu ça aussi mais la doc n'est pas simple à comprendre.

Ce que je fais n'est pas du spam, c'est une information que j’envoie à un dépôt sur des données entrées par leur client.
Je n'ai toujours pas trouver la solution, c'est comme si le mail() coupait la requête en fait.

EDIT : je viens de tester une boucle simple
for ($i=0; $i<10; $i++) {

mail('monmail, 'sujet', 'txt')or die('échec de l\'envoi...');

}
et je reçois bien les 10 mails

Re: Envoi de mail() dans une boucle.

par moogli » 31 mai 2011, 20:33

j'ajouterais un bout de la doc ;)
Note:

Il est important de noter que la fonction mail() n'est pas conseillée pour traiter de gros volumes de mails dans une boucle. Cette fonction ouvre et ferme un socket SMTP pour chaque mail, ce qui n'est pas très efficace.

Pour envoyer de gros volumes de mails, reportez-vous aux paquets » PEAR::Mail et » PEAR::Mail_Queue.
@+

Re: Envoi de mail() dans une boucle.

par AB » 31 mai 2011, 17:06

Sinon concernant ovh ils limitent effectivement le nombre de mail envoyés par jour avec la fonction mail mais c'est indiqué clairement dans la fiche technique de chaque offre.
Par exemple 500 mail/jours en offre perso; 1000 mail/jour en offre pro, etc.

Re: Envoi de mail() dans une boucle.

par Mazarini » 31 mai 2011, 11:29

Bonjour,

Sauf erreur de ma part :
- sur le dernier enregistrement, tu fais l'envoi, mais tu n'alimentes pas les infos correspondante.
- sur le premier enregistrement, la comparaison avec $tab[$i-1] me semble suspect.

Je te conseille de faire des fonctions pour traiter les différents cas :
- rupture_premiere -> initialisation du traitement
- enregistrement_courant -> ajout de la ligne
- rupture_dernière -> fin du traitement avec envoie du mail

Ensuite tu fait une boucle simple qui traite l'enchainement des fonctions :
$premier = true;
$cle_courante = '';
while ($result=mysql...)
   if ($cle_courante <> $result['cle'])    /* on est dans le cas d'une rupture
   {
        if (not $premier)      /* on traite le groupe précédent  sauf si c'est le premier enregistrement
        {
            rupture_derniere();
        }
        $premier = false;
        $cle_courante = $result['cle'] ;
        rupture_premiere();  /* on initialise le groupe que l'on va traiter
   }
  enregistrement_courant();
}
if (not $premier) rupture_derniere();   /* on traite le dernier groupe sauf si pas d'enregistrement

Re: Envoi de mail() dans une boucle.

par Cyrano » 30 mai 2011, 23:00

Indente donc ton code, ce sera d'abord plus facile à lire, ensuite tu verras peut-être qu'il y a une erreur : deux accolades fermantes de plus (4) qu'il ne s'en ouvre (2)

Envoi de mail() dans une boucle.

par Al PiGiNo » 30 mai 2011, 11:14

Bonjour,
je vois déjà des gens crier au scandale, mais je vous rassure, je n'ai pas le choix.
Voici ma situation : des personnes passe des commandes sur mon site et ces données se stockent dans une table histo_reassort.
Un personne peut passer commande pour plusieurs produits et une personne est lié à un seul dépôt. Le dépôt, quant à lui, peut avoir plusieurs clients (j'espère que vous suivez :P )
Je met en place un mailing automatique tout les 3 jours via une page PHP, du résumé des commandes des clients à chaque dépots.

Voici mon code :
<?php

if (isset($_POST['mail'])) {
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////Requete récupérant les données à envoyer////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
$query= '	SELECT *
			FROM `histo_reassort` h, `produit` p, `diffuseur` d, `validation_diffuseur` v
			WHERE h.`nim`= d.`dif_nim`
			AND h.`produit_id`=p.`produit_id`
			AND TRIM(p.`produit_mev`)="1"
			AND TRIM(v.`nim`)=TRIM(d.`dif_nim`)
			AND `valide`!="2"
			ORDER BY `nim_depot`';
$req=mysql_query($query) or die (mysql_error());
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////Requete remplissant la premiere donnée du tableau///////////////////////////
////////////////////////////////////////(pour éviter certaines erreur)/////////////////////////////////////
$premier_nim_depot=mysql_result ($req, 0, nim_depot) or die (mysql_error());
$tab=array();
$tab[0]=$premier_nim_depot;

$i=1;
mysql_data_seek($req, 0);
$txt = 'Bonjour, 
Vous trouverez ci-dessous les demandes d\'implantations ou de réassorts de vos diffuseurs saisies sur notre site internet.

Nous vous remercions de prendre en compte ces demandes (ces produits sont disponibles au magasin central réassort si nécessaire)


';
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////On lance la boucle pour le mail/////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
while ($result=mysql_fetch_assoc($req)) {
	$tab[$i]=$result['nim_depot'];
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////Si le nim est différent du nim précendent////////////////////////////////////
///////////////////////////////////////on envoie le mail////////////////////////////////////////////////////////
	
	if($tab[$i-1]!=$result['nim_depot']||$i==$count) {
		$query_date='SELECT CURDATE()';
		$req=mysql_query($query_date);
		$date=mysql_result($req, 0);
		$mail = 'mail';
		$sujet ='Important : demande de réassorts ou implantations sur produit xxxx du '.$date.'';
		$from = 'xxxxxx'; 
		$from_mail = 'mail'; 
		$headers = "From: \"$from\"<$from_mail> ";

 mail($mail, $sujet, $txt, $headers);

		$txt = 'Bonjour, 
		Vous trouverez ci-dessous les réassorts de vos diffuseurs saisies sur notre site internet.

		Nous vous remercions de prendre en compte ces demandes (ces produits sont disponibles au magasin central réassort si nécessaire)


		';
	}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////On remplit le mail avec les différentes données//////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////

	if (trim($result['produit_presentoir'])==1) {
		$txt .= 'Nil : '.$result['dif_nil'].'
		Nom : '.$result['dif_nom'].'
		Nim : '.$result['dif_nim'].'
		Produit : '.$result['produit_libelle'].'
		Produit en présentoir : Oui 
		Produit par présentoir : '.$result['produit_conditionnement'].'
		Nbre de présentoir commandé : '.$result['qte_reassort']/$result['produit_conditionnement'].' soit '.$result['qte_reassort'].' exemplaires


		';
	}
	else {
		$txt .= 'Nil : '.$result['dif_nil'].'
		Nom : '.$result['dif_nom'].'
		Nim : '.$result['dif_nim'].'
		Produit : '.$result['produit_libelle'].'
		Produit en présentoir : Non$
		Nbre de produit commandé : '.$result['qte_reassort'].'


		';
	}
$i=$i+1;
}
} ?>
Le problème est que cela ne m’envoie qu'un mail, et que l'echo du $i s’arrête à 14 alors que il y a 17 lignes dans la table. (le mysql_num-rows($req) vaut 17)

Donc voilà, je suis hébergé chez OVH, est-ce que ce serait eux qui bloquerait le mail dans une boucle ou est-ce une erreur de ma part ?

Merci d'avance