neotenien

Bonjour à tous les freenautes

Je vous fait part de mon constat concernant la fonction mail() de php, qui, quand on utilise PHP5 dans les pages persos de free, ne fonctionne pas (IE, messages non reçus par le correspondant), alors que quand c'est en PHP 4 (par défaut des pages persos) ça envoie bien les messages.

Y-a-til un paramétrage spécifique à effectuer pour utiliser mail() avec PHP5 ?

C'est ennuyeux car cela fait plusieurs mois que le site internet fonctionne en mode PHP5 et il y a eu des internautes qui ont dû envoyer des messages non reçus par les destinataires...

cartomi

non, elle n'est pas désactivée (fonctionne sur mes pages ) mais assez chatouilleuse sur le contenu des entêtes.
il y a un bon résumé ici

neotenien

Bonjour

Tu ne répond pas à ma requête...

Je répète, le problème ne vient pas de l'excès de messages ou l'ajout de pièces jointes puisque mon application, déjà, ne permet pas l'envoie de pièces jointes, de plus, il n'y a pas plus de ... allez 5 courriels envoyés par semaines!

Mais cela vient du fait d'être en mode PHP5 des pages persos (et pas en PHP4). En mode PHP4, pas de soucis, les courriels sont bien envoyés (j'ai supprimé le mode PHP5 hier).

J'aimerais qu'un expert du sujet me réponde SVP : est ce qu'il y a un dysfonctionnement de la fonction mail() avec PHP version 5 ?

neotenien

J'ai réessayé en utilisant ton lien, avec le lini fichier php de test de la messagerie à créer. D'abord en version PHP 4, puis PHP5, et j'ai réessayé avec mon script en mode PHP4 et PHP5... et ça refonctionne normalement... Bizarre, ces caprices...

Parce qu'il n'y a aucun excès de messages (tout au plus 5 message par semaine, point d'envoie de fichier et même pas de version HTML)

Bon je considère le problème résolu... Même si je ne sais pas pourquoi les messages n'arrivaient pas depuis quelques mois.

J'en profite pour indiquer un bout de code à intégrer dans vos pages PHP suivant que vous êtes en version 4 ou 5 de PHP sous les pages persos.

/*
Ce bout de code est à intégrer dans vos pages si vous surfez entre PHP4 et PHP5...
Si en PHP5, le default_timezone n'est pas défini, vous aurez un message de warning apparaissant chez free.
*/
$php_version=explode('.', phpversion());
if ($php_version[0]=="5")
   {
//   echo phpversion();
   date_default_timezone_set("Europe/Paris");
   }


DGirro

Bonjour,

Pour l'envois de mail sur les pages persos free le probleme persiste depuis 6 mois je pense !!!!

Le pb ne vient ni de PHP4, ni de PHP 5.
De plus j'ai testé le sample de mamac et le pb est toujours là :
1 fois sur 2 ou 3 la mail n'arrive pas aux destinataires (ni dans la boite spam) !
ET surtout jamais de code d'erreur retour sur l'appel à la fonction mail(), tout est ok...?

Qui d'autre à le pb ? Une idée ?

Pour infos :
j'utilise les infos/recommandations suivantes :

Pas plus de 2 000 mails envoyés / semaine (cela inclut les tentatives de spam, les flood, les messages non remis…

si les formulaires ne sont pas correctement configurés et protégés cela peut aller vite) ; message d'erreur du genre : Warning: mail() [function.mail]: Quota mail atteint… ;

Pas plus de 20 destinataires et/ou appels de la fonction mail par exécution de script PHP ; message d'erreur du genre : Warning: mail() [function.mail]: Trop de destinataires, vous êtes suspendu. ;

La valeur du From: doit être l'email du compte depuis lequel est envoyé l'email ;

Système de détection de SPAM ; message d'erreur du genre : Warning: mail() [function.mail]: SPAM détecté. ;

Pas (ou peu) de pièces jointes ;

Ne pas inclure de contenus pouvant être assimilés à du spam (nombreux liens…) ;

Pas d'envois trop rapprochés ;

Pas d'envois trop fréquents au(x) même(s) destinataire(s) ;

Ne spécifiez pas tous les en-têtes, uniquement les principaux (cf. le code d'exemple en bas de page) car, si vous écrasez les en-têtes automatiquement insérés par les serveurs d'envoi par les vôtres, il y a de grandes chances que l'email ne passe pas, alors que la fonction mail() était bien codée, le contenu et le format correct, et que l'exécuteur PHP à bien remis l'email au serveur perso1, en charge des envois depuis les PP ;
Format mime text/plain ou multipart (text/html + text/plain), n'envoyez jamais de courriel au format text/html uniquement ; le jeu de caractères doit être us-ascii, iso-8859-1, iso-8859-15.

neotenien

Toutes les recommandations sont respectées!

Le soucis semble vraiment venir du fait d'utiliser PHP5 au lieu de PHP4 (Je viens de refaire 3 tentative d'envoie de message en PHP5, pas de réception, puis une tentative en PHP4 et ça arche!)

Non, le FROM ne doit pas forcément contenir l'adresse email du site intenet!! C'est celle de l'expéditeur.

Je n'ai jamais joint de pièce (c'est impossible avec la fonction mail), ni fait d'envoi groupé. Le problème ne vient que de ce compte de page perso là (www.mptcoulaines). Avec les autres, ya pas ce soucis (et comme par hasard, les autres sont sous PHP4).

Je crois que le soucis vient réellement de la fonction mail() sous PHP5!!

-Neko

Je rencontre aussi ce même problème en php 5.
1/2-3 mails arrivent à destination. Je n'ai pas testé en php 4 mais je pense que cela vient du serveur smtp de free et non de la configuration de php 5.


cartomi

A en lire le grand nombre de suspensions pour ce motif : il semble que beaucoup de pages perso aient été compromises afin de générer du spam, il est probable que du coup les serveurs sortants soient surchargés

neotenien

J'en suis toujours au même point GRRR!!

Même en PHP4 ça ne marche pas. Il n'y a aucun message d'alerte lors de l'utilisation de la fonction mail() sur mes scripts mais le message n'arrive pas à destination (alors que l'utilisation de Zimbra pour m'envoyer des messges fonctionne), ou alors très rarement.

Plusieurs interrogations :
1/ J'ai entendu parler de "relais" c'est à dire un moyen d'utiliser un autre serveur SMTP via PHP... Quelqu'un connait-il la procédure pour free ? Et quel serveur me conseillez-vous ?
2/ J'ai aussi vu de la doc sur PEAR::Mail (ou un truc du genre)... Ces classes sont-elles dispo chez free ?
3/ Mon code est celui-ci

$mail_head = "MIME-Version: 1.0\n";
$mail_head .= "Content-Type: text/plain; charset=UTF-8\n";
$mail_head.="From: Albatros concept <[email protected]>\n";
$mail_msg="Bonjour ".$cgi["Pseudo"].",\n\n";
$mail_titre="Albatros concept: Demande de confirmation de votre inscription ".$cgi["Pseudo"]."\n";//(Le cgi est ce qui est envoyé par formulaire)
mail($cgi["Email"],$mail_titre,$mail_msg,$mail_head);//envoie a l'abonne
[/tt]

Le code est-il bon ? J'ai l'impression que mail() ne permet pas d'envoyer plusieurs fois à la même adresse email... De plus pour le "From", je ne souhaite pas que l'expéditeur soit l'adresse email du compte de pages perso (pour des raison de ne pas recevoir de spams)

J'espère résoudre ces problèmes rapidement! Mon application d'inscription d'abonnés est en place mais c'est juste cette fonction de gestion d'email qui déconne...

neotenien

Bonne nouvelle!!

Ca marche enfin! Je pense que ça venait du mauvais format des variables que j'ai mis dans la fonction mail()

Ainsi, conseils aux développeur :

Le bon code est:

$mail_head="From : Quelqun <[email protected]>\r\n"; //Ne pas oublier le \r\n à la fin c'est hyper important)
$mail_titre = "Mon titre"; //Sans \r\n cette fois
mail("[email protected]", $mail_titre, "Message du corp du texte", $mail_head")


Normalement, si vous accédez à la page de script la première fois, que vus validez le formulaire pour l'envoie de mail, la page met quelques temps à se rafraichir. Si cela ne se produit pas, c'est que la fonction mail() n'aura pas été utilisée correctement (problème de caches). Il peut donc s'avérer nécessaire d'ajouter :

header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Cache-Control: post-check=0, pre-check=0', false);


En début de script.

aldeco

Le bon code est:

$mail_head="From : Quelqun <[email protected]>\r\n"; //Ne pas oublier le \r\n à la fin c'est hyper important)
$mail_titre = "Mon titre"; //Sans \r\n cette fois
mail("[email protected]", $mail_titre, "Message du corp du texte", $mail_head")


celle ci ne fonctionne pas sur mon site...

je commence a perdre espoir quant à l'utilisation de la fonction mail() chez free... comment savoir ce que l'on doit respecter ?? jai essayer plusieurs facon de l'écrire et aucunes ne fonctionnent...

Quelqu'un aurait une solution générique applicable à tout abonnés free ? je crois que c'est ce qu'il nous manquent...

sinon personnellement, je cherche a recuperer des info entrées dans un formulaire et à les renvoyer par mail, ca semble plutot simple et pourtant..

fabfree

function EnvoyerMail($destinataire, $nom, $email, $sujet, $texte)
{
$expediteur   = "formulaire <[email protected]>";
$sujet        = $sujet;
$reponse      = $email;  /*  Repondre à : reply-To*/

$headers  = 'MIME-Version: 1.0' . "\r\n";
$headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n"; /* encodage message */
$headers .= "From: $expediteur\r\nReply-To: $reponse\r\n";

// Additional headers
//$headers .= 'To: Jean <[email protected]>, Pierre <[email protected]>' . "\r\n";
//$headers .= 'Cc: [email protected]' . "\r\n";
//$headers .= 'Bcc: [email protected]' . "\r\n";

$texte = stripslashes($texte);
$texte="<strong>$nom   $email</strong> a ecrit via le formulaire contact : <br /><em>$texte</em>";

return(mail($destinataire,$sujet,$texte,$headers));
}

Voilà ce que j'utilise sur mon site pour mon formulaire contact... et cela marche

Philout

Bonjour,
Le script de Fabfree fonctionne..... comme les autres, (testé sur un site Free, en Php4) 1 fois sur 3 (environ)..
Mon avis : quand un envoi fonctionne une fois et ne fonctionne pas la fois suivante, alors que tout est identique, on peut logiquement en déduire que la différence (car il faut bien que quelque chose ait changé) vient de chez Free (encombrement du serveur ?), et non du script.
Ma solution : Je controle le temps mis pour l'exécution de la fonction mail() : lorsque la fonction n'est pas vraiment exécutée elle met moins d'une milliseconde. (Pourtant elle ne retourne pas de message d'erreur). Quand elle est vraiment exécutée et que le mail est envoyé, elle a mis environ 2,005 secondes.
Donc si le temps d'exécution est inférieur à 2 s, je refait automatiquement une tentative d'envoi après une attente de 2 ou 3 s. Si au bout de 5 tentatives la fonction mail() n'a toujours pas été exécutée, j'interromps la boucle.

DGirro

Salut Philout,

je suis d'accord avec toi, le bug du server d'envoi de mail de Free doit être surchargé et la pile limitée du coup si ca sature ton mail n'est pas enregistré dans la pile.

RIEN A VOIR AVEC VOTRE CODE OU LE NIVEAU DE PHP 5 ou 4 !

Je pense que tu as trouvé la solution du coup :

- Si moins de 2s c'est que tu n'as pas été enregistré dans la pile d'envoi et du coup la fonction n'est pas exécutée, Rem : je pense que du coup c'est pour cela que nous n'avons pas de message d'erreur (c'est là que ce trouve le bug de free qui ne transit pas le message de non envoi - tunning perfo je pense mais pas cool du tout)

- Si plus de 2s c'est bon t'es enregistré puis ton mail part ou pas mais au moins tu as un msg d'erreur sur l’exécution de la fonction mail !

Philout quel est ton code pour tester le timing stp ?

A+


Philout

Bonjour DGirro,
Voici mon code (ou du moins le principe utilisé) :

$tentative = 0;
$envoi = 0;
While ($tentative < 5 AND $envoi == 0){ // 5 tentatives autorisées
$tentative++ ;
$t0 = microtime_float();
$reponse = mail($destinataire,$objet,$message,$entete);
$t1 = microtime_float();
$duree = $t1-$t0;
 if($reponse == 1 AND $duree > 1.50){$envoi = 1;}
 else{$envoi = 0;
   $pause = 0;
   while ($pause < 2.00){ // Ne pas descendre plus bas que 2s : moins bons résultats
   $t2 = microtime_float();
   $pause = $t2-$t1;
   }
 }
//echo "tentative ".$tentative.", envoi = ".$envoi.", durée : ".round($duree,4)."<br />";
}
if($envoi==1){echo "mail envoyé";}else{echo " le mail n'a pu être envoyé, réessayez !";}


function microtime_float(){list($usec, $sec) = explode(" ", microtime());
 return ((float)$usec + (float)$sec);}