Mail : envoi multiple via une boucle

Mammouth du PHP | 737 Messages

05 mai 2009, 09:53

Bonjour,

J'ai un problème avec le code suivant. Je voulais savoir si on pouvait l'optimiser (ca rame un peu) mais surtout faire en sorte que ca marche hors je ne vois pas ou ça déconne alors qu'à part l'envoi de mail tout fonctionne. Ma table comporte des adresses mails valide bien sur et tous les echo de valeur sont probants #-o
$mail = 0;
foreach($_POST['cac'] as $key => $value) {
$q = "SELECT * FROM utilisateurs WHERE id_utilisateur = ".$value;
$r = mysql_query($q);
while($row=mysql_fetch_array($r)){
$destinataire = $row["mail_utilisateur"];
mail("$destinataire","Avis à populous", $_SESSION["log"]. " a posté un message pour vous");
$mail++;
}
}
Mega
;)

[Note : ce message a été posté de manière anonyme avant d'être réattribué à son auteur]
Modifié en dernier par Megadeth le 05 mai 2009, 10:56, modifié 1 fois.

Eléphant du PHP | 70 Messages

05 mai 2009, 10:20

Peux-tu construire ta requête autrement?
Pour chaque $_POST['cac']? tu crées une nouvelle requête et tu l'exécutes.

Pourquoi ne ferais-tu pas celà en une seule requête?

D4Y
Eléphant du PHP | 52 Messages

05 mai 2009, 10:50

Qu'est-ce qui ne va pas dans l'envoi du mail ?

Mammouth du PHP | 737 Messages

05 mai 2009, 10:59

bonjour,

Le mail n'arrive tout simplement pas...

Pour faire cela en une seule requête : j'étais parti du principe du foreach pour identifier via la $valeur.

Tu vois une autre soluce ?

Mega
;)

Eléphant du PHP | 70 Messages

05 mai 2009, 11:08

Utilise le foreach pour créé ta requête.

Une fois la requête créée (et donc le foreach terminé) tu n'as plus l'exécuté.
$mail = 0;

// Création de la requête
$q = "SELECT * FROM utilisateurs WHERE id_utilisateur  in (";
foreach($_POST['cac'] as $key => $value) 
{ 
    // Ajout de l'ID
    $q += $value.",";
} 

// On retire la dernière virgule
$q = substr($q, 0, -1);

// On termine la requête
$q += ");";

$r = mysql_query($q); 
while($row=mysql_fetch_array($r))
{ 
    $destinataire = $row["mail_utilisateur"]; 
    mail("$destinataire","Avis à populous", $_SESSION["log"]. " a posté un message pour vous"); 
    $mail++; 
}

ViPHP
ViPHP | 2144 Messages

05 mai 2009, 11:25

Pour ce genre de problème, il faut explorer plusieurs pistes, notamment:
- le mail n'est pas parti
- le mail est bien parti mais fini dans le filtre anti-spam.

Mammouth du PHP | 737 Messages

05 mai 2009, 11:51

Utilise le foreach pour créé ta requête.

Une fois la requête créée (et donc le foreach terminé) tu n'as plus l'exécuté.
$mail = 0;

// Création de la requête
$q = "SELECT * FROM utilisateurs WHERE id_utilisateur  in (";
foreach($_POST['cac'] as $key => $value) 
{ 
    // Ajout de l'ID
    $q += $value.",";
} 

// On retire la dernière virgule
$q = substr($q, 0, -1);

// On termine la requête
$q += ");";

$r = mysql_query($q); 
while($row=mysql_fetch_array($r))
{ 
    $destinataire = $row["mail_utilisateur"]; 
    mail("$destinataire","Avis à populous", $_SESSION["log"]. " a posté un message pour vous"); 
    $mail++; 
}
Merci d'avoir pris le temps de m'expliquer et même plus (cette approche sql), mais malheureusement j'ai une erreur :
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /.../.../.../admin.php on line 79




Modif de 12h25

J'ai changé les += par des .= et l'erreur a disparu mais les mails n'arrivent toujours pas :?



Mega
;)

D4Y
Eléphant du PHP | 52 Messages

05 mai 2009, 13:09

si tu fais un echo $destinataires dans ta boucle , les adresses emails sont correctes ?

Eléphant du PHP | 70 Messages

05 mai 2009, 13:11


Modif de 12h25

J'ai changé les += par des .= et l'erreur a disparu mais les mails n'arrivent toujours pas :?



Mega
;)
Désolé, ce sont les habitudes du .net :-)

Mammouth du PHP | 737 Messages

05 mai 2009, 13:51

Désolé, ce sont les habitudes du .net Smile
"désolé" -> Pas de souci tu rigoles, merci beaucoup pour ton apport. J'ai fait aussi quelques heures sur asp.net. ^^
Plus j'avance et plus je me rends compte que j'ai plutôt des lacunes sql...
si tu fais un echo $destinataires dans ta boucle , les adresses emails sont correctes ?
Oui tout à fait, c'est ça le pire, l'echo renvoie bien mes adresses mail. :cry:

Ca viendrait du serveur ? Pourtant je n'ai jamais eu de souci avec ce dernier pour l'envoi de mail...

En fait je reçois les mails vers des adresses en interne mais quand c'est vers l'extérieur ça ne marche plus...

Cordialement,

Mega
;)

D4Y
Eléphant du PHP | 52 Messages

05 mai 2009, 14:00

je ne pense pas que ca change grand chose mais essaie

mail($destinataire,"test", "test");

Mammouth du PHP | 737 Messages

05 mai 2009, 14:24

Re,

J'avais déjà fait ce test mais j'ai repris ton exemple et rien.

Sous la ligne du dessous j'ai mis une adresse en interne et ça passe. Je pense maintenant à un problème smtp plutôt qu'autre chose. Je n'ai pas la main sur le serveur et c'est vrai que jusqu'alors je n'avais jamais envoyé de mail autre que vers des boites en interne, sacré paramétrage. J'm'en choppé un admin serveur :twisted:

Vous avez une piste ? Savoir où regarder ? Où taper :lol:

Mega
;)

ViPHP
AB
ViPHP | 5818 Messages

05 mai 2009, 17:12

Cela vient peut-être du nombre de mail que tu essaies d'envoyer successivement ce qui fait saturer le serveur. Combien de mail au total ?

Mammouth du PHP | 737 Messages

06 mai 2009, 12:06

3 :lol: