Vous n'êtes pas identifié.
ça marche !
Hors ligne
Bon, allez, je me charge de la rédaction de la doc, histoire d'écrire un petit tutoriel ![]()
Je la met dans la documentation ? Quelle catégorie ?
Hors ligne
Je reprends le fil de ce post, car je rencontre à nouveau le même soucis alors que je pensais l'avoir résolu !
A présent, je ne parviens pas à programmer la fonction mail() avec plus de 4 adresses email !!!
Avec 4 adresses email, elle fonctionne. Avec 5 adresses email, elle ne fonctionne plus ! Mes adresses email sont stockées dans une bdd sous la forme d’une chaîne de texte. Elles sont écrites de la façon suivante : destinataire1@fai.com, destinataire2@fai.com, destinataire3@fai.com, destinataire4@fai.com, destinataire5@fai.com, destinataire6@fai.com, …. destinataireN@fai.com
Sachant que la fonction mail n’est pas bridée sur Olympe, comment se fait-il que cela ne fonctionne pas ?
Voici mon bout de code :
$sql = "SELECT * FROM visites WHERE Validation ='".$session."'";
$resultat = mysql_query($sql);
if(false==($ligne = mysql_fetch_assoc ($resultat)))
{
$er = 'Erreur.<br/>';
echo $er;
}
if(er!='')
{
$Zone1 = $ligne['Zone'];
$reponse = mysql_query("SELECT Emails FROM Option2 WHERE Zone='$Zone1'");
if(false==($ligne2 = mysql_fetch_assoc ($reponse)))
{
$erreur2 = 'Problème.<br/>';
}
}
$mailto = array($ligne2['Emails']);
$mailfrom = $ligne['Mail'];
$ligneobjet = nl2br($ligne['Objet']);
$lignemessage = nl2br($ligne['message']);
/* Message2 */
$message2 = '<html><head><title>Message</title></head><body>'.$lignemessage.'</body></html>';
// Préparation des données à envoyer aux destinatires finaux
// Envoyer un mail HTML, type de contenu d'en-tête.
$headers = "MIME-Version: 1.0\r\n";
$headers .= "Content-type: text/html; charset=iso-8859-1\r\n";
// additional headers
$headers .= "To: ".$mailto." \r\n";
$headers .= "From: ".$ligne['prenom']." ".$ligne['Nom']." <".$mailfrom."> \r\n";
// Envoi du courrier
for ($i=0;$i<count($mailto);$i++)
{
mail($mailto[$i], $ligneobjet, $message2, $headers);
}Modération: Mettez votre code entre des balises codes [ code ]votre code[/ code] ![]()
Hors ligne
Bonjour,
Pouvez-vous nous faire parvenir le résultat complet de la fonction mail et des arguments lorsque cela ne fonctionne pas ?
if( mail($mailto[$i], $ligneobjet, $message2, $headers) === FALSE )
{
$debug = "TO : " . print_r($mailto[$i], true);
$debug .= "<hr>SUBJECT : " . print_r($ligneobjet, true);
$debug .= "<hr>MESSAGE: " . print_r($message2, true);
$debug .= "<hr>HEADERS : " . print_r($headers, true);
$quota = olympe_quotas();
$debug .= "<hr>QUOTA : " . print_r($quota[2], true);
echo nl2br($debug);
}Vous pouvez envoyer le résultat à l'adresse support@olympe en précisant que cela se rapporte à ce message du forum. Pour mieux comprendre, et si cela est possible pour vous, ne modifiez rien dans les valeurs de retour, les adresses emil,... car il se peut que ce soit lié.
Bien à vous
Hors ligne
Et comme ceci ?
// additional headers
// $headers .= "To: ".$mailto." \r\n";
$headers .= "From: ".$ligne['prenom']." ".$ligne['Nom']." <".$mailfrom."> \r\n";
// Envoi du courrier
for ($i=0;$i<count($mailto);$i++)
{
$headers2 = "To: ".$mailto[$i]." \r\n";
mail($mailto[$i], $ligneobjet, $message2, $headers.$headers2);
}
Dernière modification par Eric (2009-11-03 13:48:03)
Hors ligne
Bonjour Eric,
Merci pour votre intérêt à mon problème... J'ai tenté votre proposition, mais rien ne fonctionne, ni avec 4 adresses email, ni avec 5.... Par contre, à chaque fois... le nombre d'adresse email essayé s'ajoute au quota des mails envoyés. Mais rien ne part. Pour mes essais, je simule les adresses mail avec des adresses personnelles factices.
Je me demande si le problème ne vient pas du header...???
Chaussette Trouée, j'ai suivi vos consignes et je vous ai posté le résultat de la requête. Visiblement, les adresses mails ne sont pas lues lorsqu'il y en a 5 même si elles s'ajoutent au quota... Inversement cela fonctionne correctement avec 4 adresses mail....
Hors ligne
Je souhaitais convertir ma chaine de texte en tableau.... composé d'autant d'éléments qu'il y a de virgule. Cette chaine de texte est constituée de plusieurs adresses email... et elle rédigée de la manière suivante : dest1@fai.com, dest2@fai.com, dest3@fai.com, .... destN@fai.com
Pour cela, j'ai traité le résultat de ma requête sql de la manière suivante : $mailto = array($ligne2['Emails']);
Normalement, avec 5 adresses emails, je devrais obtenir le chiffre 5 lorsque je fais : echo count($mailto);
En réalité, j'obtiens 1. Ceci signifie que ma chaîne de caractère ne devient pas un tableau composé de 5 éléments, mais elle devient un tableau composé d'1 élément. Ceci signifie que les virgules ne sont pas reconnues comme séparateur...
Normalement, dans le cadre d'un tableau simple, on utilise bien des virgules ?
Hors ligne
$mailto = split(', ', $ligne2['Emails']);Hors ligne
Rhooo qu'elle est forte cette chaussette ![]()
Hors ligne
Je reviens enfin vers vous.... pour remercier tout le monde et bien sûr Chaussette trouée... Mon problème semble enfin résolu ! Voici les lignes finales :
$mailto = split (", ", $ligne2['Emails']);
/* J'ai aussi essayé : explode (", ", $ligne2['Emails']); ça marche mais la requête est un peu plus longue. Finalement split() est mieux. */
$prenom = $ligne['prenom'];
$nom = $ligne['Nom'];
// Envoi du courrier
for ($i=0;$i<count($mailto);$i++)
{
$mailto2 = $mailto[$i];
// Envoyer un mail HTML, type de contenu d'en-tête.
$headers = "MIME-Version: 1.0\r\n";
$headers .= "Content-type: text/html; charset=iso-8859-1\r\n";
$headers .= "To: ".$mailto2." <".$mailto2."> \r\n";
$headers .= "From: ".$prenom." ".$nom." <".$mailfrom."> \r\n";
mail($mailto2, $ligneobjet, $message2, $headers);
$k = $i+1;
echo ' Destinataire n°'.$k.' : '.$mailto2.' : OK / ';
}
Normalement, je sais qu'il n'est pas conseillé de mettre un header dans une boucle.... et j'ai aussi appris que la fonction mail() ne convient pas pour des envois de "masse". Je précise que mon application n'est pas du spam. Cette fonction ne convient pas car elle ouvre un socket à chaque envois de mail, puis le referme. A ce titre le socket pourrait rester ouvert...
Plus tard, je prévois de remplacer cette fonction par une autre plus appropriée. Pour l'instant, je souffle un peu...
Que le mont Olympe est haut !!!
Hors ligne
Bonjour,
Pour les "sockets" ouverts, nous avons des mécanismes de nettoyage sur nos serveurs.
Mais comme vous l'indiquez, pour les mails de masse, ce n'est pas le plus indiqué, il vaut mieux passer par un SMTP (externe) qui sera plus performant et plus robuste.
L'important c'est que cela fonctionne ![]()
Bien à vous
Hors ligne
Effectivement, la priorité c’est une fonctionnalité qui fonctionne même si le processus n’est pas complètement optimisé ! Pour un petit bricolo comme moi, de toute façon, la satisfaction est bien là.
Toutefois, j’ai encore un petit problème….
Voici comment j’utilisais la fonction mail() :
$headers .= "To: ".$mailto." <".$mailto."> \r\n";
$headers .= "From: ".$prenom." ".$nom." <".$mailfrom."> \r\n";
if(mail($mailtomail, $ligneobjet, $message2, $headers))
{
/* Confirmation du succès de l’envoi du mail */
}
Dans ma variable $mailto, je plaçais un string du type destinataire@fai.com.
Dans ma variable $mailfrom, je place un string du type expediteur@fai.com.
Résultat dans mon header, j’avais 3 adresses emails (et donc 3 x @). Aussi, à chaque envoi de mail, j’ai pu vérifié que chaque envoi comptait pour 3 au lieu de 1.
Alors, il m’est venu l’idée de reformuler le header de la manière suivante :
$headers .= "To: ".$nom." <".$mailto."> \r\n";
$headers .= "From: ".$prenom." ".$nom." <".$mailfrom."> \r\n";
if(mail($mailtomail, $ligneobjet, $message2, $headers))
{
/* Confirmation du succès de l’envoi du mail */
}
Dans ma variable $nom, à présent je place un string : Nom !
Dans la variable $mailto, je place un string du type destinataire@fai.com.
Dans ma variable $mailfrom, je place un string du type expediteur@fai.com.
Résultat dans mon header, à présent, j’ai 2 adresses emails, et à chaque envoi de mail, je peux vérifier que chaque envoi compte pour 2 au lieu de 1.
Conclusion, je suppose qu’à chaque envoi de mail, l’Olympe_quota s’incrémente sur la base du nombre d’@ placé dans le header. Normalement, seul celui du destinataire devrait compter (?)
Hors ligne
Je confirme mon message ci-dessus !
Je viens de procéder à l'envoi d'un seul mail. Ce mail contenait un header comprenant entre autre l'adresse de l'expéditeur et celle du destinataire, soit 2 x @. Puis dans le nom de l'expéditeur, j'ai mis 8 @ d'affilé : Nom@@@@@@@@prénom.
Le quota s'est incrémenté de 10.
Hors ligne
Bonjour,
Effectivement, le quota est calculé simplement en fonction du nombre de @ présent dans les headers (sauf le From) et dans le "$to" de la fonction mail.
Il n'est pas nécessaire de répéter les destinataires à la fois dans le "To" du header et dans le "$to" de la fonction mail.
Dans votre cas, vous pouvez laisser tomber complètement la partie
$headers .= "To: ".$nom." <".$mailto."> \r\n";
Bien à vous
Hors ligne
Et dire que c'est cette partie du header qui m'embête (pour rester poli) depuis le début de ce post !
Et dire qu'il suffisait de la supprimer tout simplement !
Et dire que je n'avais même pas essayé !!!
Merci pour tout !
Hors ligne