Forum ZitePLUS

La communauté des utilisateurs du CMS ZitePLUS

Vous n'êtes pas identifié(e).

#1 01/02/2019 09:32:13

bernard
Membre
Lieu : Nemours
Inscription : 14/06/2011
Messages : 38

fORMULAIRE CONTACT

Bonjour,

Mon fournisseur d'accès est FREE. Je me sers du module "contact" pour que les visiteurs de mon site puisse m'envoyer un formulaire.

Toutes les zones sont remplies. Le capcha fonctionne. J'appuie sur le bouton "envoyer", quelques instant après l'avertissement du formulaire envoyé apparait.

Malheureusement je ne reçois rien.

Que puis-je faire ?

Merci de votre aide

Hors ligne

#2 01/02/2019 12:31:43

jpg
Administrateurs
Inscription : 19/11/2008
Messages : 2 086
Site Web

Re : fORMULAIRE CONTACT

Bonjour Bernard,

La fonction mail() de Free n'est pas conforme au standard php.

De temps en temps les courriels ne sont pas envoyés, mais pourtant leur fonction mail() renvoie True (et le courriel sera définitivement perdu ...)

Au fil des années, il y a eu de multiples échanges sur les groupes de discussions de Free en pure perte sad

Ce problème n'est pas spécifique à Ziteplus, mais touche tous les scripts PHP des freenautes utilisant la fonction mail().


Il existe une solution empirique permettant de contourner le problème.

Il faut remplacer l'appel à la fonction mail() par la fonction mailFree() suivante à insérer dans ton code:

function mailFree($to , $subject , $message , $additional_headers=null , $additional_parameters=null) {
$start_time = time();
$resultat=mail ( $to , $subject, $message, $additional_headers, $additional_parameters);
$time= time()-$start_time;
return $resultat & ($time>1);
}

La modification est à faire dans le module contact à la ligne 108 (en fonction des versions du module)
et de remplacer la ligne
          if (mail($cible, $objet, $message, $headers)) {
par
          if (mailFree($cible, $objet, $message, $headers)) {




a+
Jean-Paul

Hors ligne

#3 01/02/2019 15:36:26

bernard
Membre
Lieu : Nemours
Inscription : 14/06/2011
Messages : 38

Re : fORMULAIRE CONTACT

Bonjour Jean Paul,

Mon problème est toujours là !

Je n'y connais rien en PHP ! par le FTP j'ai récupéré le fichier "contact.php", rapatrié sur mon ordinateur,  modifié sur le BlocNotes et remis dans le dossier par le FTP.

J'ai fait un copier coller de la function et modifier la ligne citée dans ta réponset. et j'ai remis le tout en place.

J'ai très certainement du faire une bêtise mais laquelle ?

Je joints ci-dessous le fichier "contact.php".

Si cela peut être utile je suis prêt à fournir mes codes d'accès du site et de chez FREE

Cordialement

<?php
/*
module:    Contact - Gestion d'un formulaire de contact
Copyright Hubert ARNOUX 2011
Site : http://www.atod.fr/ziteplus/
Licence : CeCILL-B, http://www.cecill.info

Historique:
  Version et Date      version Zite+ mini        Description
  ===============    ==================        ===========
    1.0 du 01/02/11    0.9.1.b1                  (Atod) Création du module
    1.1 du 17/04/11 0.9.2.a1                (JPG) Ajout captcha de ziteplus + diverses corrections, simplifications et modifications
    1.2 du 26/11/11 0.9.2.a7                (JPG) Petite correction bug
    1.3 du 14/04/13 0.9.2                     (JPG) compatibilité php 5.4
    1.4    du 11/03/17    0.9.5                    (JPG) compatibilité php 7.0 + ajout langues IT, DE et EN
Le module principal se trouve dans le fichier   zplus/module/contact.php
Les données ini sont dans                       zplus/module/contact.ini
les données paramètres dans                     zplus/module/config/contact.opt

Il permet de créer un formulaire de contact :
- vérification de la syntaxe d'email

- possibilité d'envoyer une copie de l'email à l'expéditeur
- configurez vos messages d'échec et de réussite d'envoi
- configurez une action du formulaire ???????????? => voir ce que devient le traitement de base du formulaire ??????????????????????????????????????????
- possibilité d'afficher le champ "nom" ou non
- possibilité d'afficher le champ "prénom" ou non
- possibilité d'afficher le champ "objet" ou non
- possibilité d'afficher le champ "civilité" ou non
- possibilité d'ajouter une signature à vos message pour savoir si le message provient de votre site <=================== voir user_auto <<<<<<<<<<<<<<<<<<<<<
- conserver les données saisies dans le formulaire en cas d'echec
- Captcha dans le formulaire de contact
PROJET :
- possibilité d'ajouter un champ "piece jointe" ou non : En projet
*/
//==============================================================================
class Tcontact extends Tmodule {
    function dojob($opt="") {
        parent::dojob();
        $out='';
    self::$cms->content['dftcss'].= ' label {
                 width:150px;
                 float:left;
                 } ';
        require_once(self::$cms->zpath.'/outils.php');
   
// Fonction pour remplacer la fonction de Mail par la Function MailFree

function mailFree($to , $subject , $message , $additional_headers=null , $additional_parameters=null) {
$start_time = time();
$resultat=mail ( $to , $subject, $message, $additional_headers, $additional_parameters);
$time= time()-$start_time;
return $resultat & ($time>1);
}

/*
     * cette fonction sert à nettoyer et enregistrer un texte
     */
    function Rec($postname) {
      $text ='';
      if (isset($_POST[$postname])) {    // si formulaire envoyé, on récupère le champ. Sinon, on initialise la variable
                $text = no_mq_gpc($_POST[$postname]);
          $text = htmlspecialchars($text, ENT_QUOTES,''); // converts to string with " and ' as well
          $text = nl2br($text);
            }
      return $text;
    };
    /*
     * Cette fonction sert à vérifier la syntaxe d'un email
     */
    function verification_email($email) {
            $pattern = "/^([a-z0-9_]|\\-|\\.)+@(([a-z0-9_]|\\-)+\\.)+[a-z]{2,7}$/i";
      return (@preg_match($pattern,$email)) ? true : false;
    };
    $err_formulaire =false;
        $err_email = $err_message= $err_messagesent = false;
            // Etablir valeurs des champs
        $nom = strtoupper(Rec('nom'));                                        //"NOM" en majuscule
        $prenom = ucwords(strtolower(Rec('prenom')));         //"Prénom" avec une majuscule puis en minuscules
        $civilite    = Rec('civilite');
    $email   = Rec('email');
    $objet   = Rec('objet');
    $message = Rec('message');
        $signature = 'Message envoy&eacute; par '.$prenom.' '.$nom.' via mon formulaire de contact ';      // à voir ============> dans les options de config
    if (isset($_POST['envoi'])) {
        // On va vérifier les variables et l'email ...
      $err_email = !verification_email($email);
      $err_message = empty($message);
      $err_formulaire |= $err_email | $err_message;
         $err_captcha = false;
            if (!$err_formulaire) {
                self::$cms->doevent(eCaptcha,eAfter,$err_captcha);
          $err_formulaire |= $err_captcha;
            }
                // Pas d'erreur => envoyer le message
      if ($err_formulaire==false) {
            // les 4 variables sont remplies, on génère puis envoie le mail
        $headers = 'From: '.$civilite.' '.$prenom.' '.$nom.' <'.$email.'>' . "\r\n";  /// Logiquement, une génération par défaut est faite + ATTENTION: faire: noreply@hhhhh pour la copie utilisateur
                $cible = $this->getOption('destinataire');
                    // envoyer une copie au visiteur ?
        if ($this->getOption('copie')) {
            $cible .= ','.$email;
        };
//=> à voir
            // Remplacement de certains caractères spéciaux
                $message = html_entity_decode($message);
                $message = str_replace('&#039;',"'",$message);
                $message = str_replace('&#8217;',"'",$message);
                $message = str_replace('<br>','',$message);
                $message = str_replace('<br />','',$message);
                $message = wordwrap($message, 70);    // Dans le cas où nos lignes comportent plus de 70 caractères, nous les coupons en utilisant wordwrap()
                if ($this->getOption('signature')){        //Dans le cas ou il faut insérer une signature
                    $message .= '
           
'.$signature;
            $message .= $this->getOption('endsignature');
                }
            // Envoi du mail   
             if (mailFree($cible, $objet, $message, $headers)) {
          //if (mail($cible, $objet, $message, $headers)) {
                return '<p>'.$this->getOption('messagesent').'</p>'."\n";
        } else {//Il y a un probleme
          $err_formulaire = $err_messagesent = true;
        };
      }
    }; // fin du if (!isset($_POST['envoi']))
    if (($err_formulaire) || (!isset($_POST['envoi']))) {
            if ($err_formulaire) {
        if ($err_email)    self::$cms->msgShow($this->get_message('err_email'),false);
        if ($err_message)    self::$cms->msgShow($this->get_message('err_message'),false);
        if ($err_messagesent) self::$cms->msgShow($this->get_message('err_messagesent'),false);
            }
        // afficher le formulaire
      $out .= '<form id="contact" method="post" action="'.($this->getOption('form_action')?$this->getOption('form_action'):'')."\">\n";

      $out .= '    <fieldset><legend>'.$this->get_message('coordonnees').'</legend>'."\n";

            if ($this->getOption('showname')){    /*On affiche le champ nom*/
                $out .= '        <p>'."\n";
        $out .= '            <label for="nom">'.$this->get_message('nom').'</label>'."\n";
        $out .= '            <input type="text" id="nom" name="nom" value="'.$nom.'" tabindex="1" />'."\n";
        $out .= '        </p>'."\n";
            }
            if ($this->getOption('showfirstname')){    /*On affiche le champ prenom*/
                $out .= '        <p>'."\n";
        $out .= '            <label for="prenom">'.$this->get_message('prenom').'</label>'."\n";
        $out .= '            <input type="text" id="prenom" name="prenom" value="'.$prenom.'" tabindex="2" />'."\n";
        $out .= '        </p>'."\n";
            }
            if ($this->getOption('civility')){    /*On affiche le champ civilité*/
                $out .= '        <p>'."\n";
        $out .= '            <label for="civilite">'.$this->get_message('civilite').'</label>'."\n";
        $out .= '               <input type="radio" id="civilite" name="civilite" value="'.stripslashes($this->get_message('monsieur')).'" '.($civilite==$this->get_message('monsieur')?'checked':'').' tabindex="3" /> '.$this->get_message('monsieur')."\n";
                $out .= '               <input type="radio" id="civilite" name="civilite" value="'.stripslashes($this->get_message('madame')).'" '.($civilite==$this->get_message('madame')?'checked':'').' tabindex="3" /> '.$this->get_message('madame')."\n";
          $out .= '        </p>'."\n";
            }

      $out .= '        <p>'."\n";
      $out .= '            <label for="email">'.$this->get_message('email').'</label>'."\n";
            $out .= '            <input type="text" id="email" name="email" value="'.$email.'" tabindex="4" />'."\n";
            $out .= '        </p>'."\n";
            $out .= '    </fieldset>'."\n";
      $out .= '    <fieldset><legend>' . $this->get_message('message') . '</legend>'."\n";
            if ($this->getOption('showobject')){    /*On affiche le champ objet*/
                $out .= '        <p>'."\n";
        $out .= '            <label for="objet">'.$this->get_message('objet').'</label>'."\n";
        $out .= '            <input type="text" id="objet" name="objet" value="'.$objet.'" tabindex="5" />'."\n";
        $out .= '        </p>'."\n";
            }
      $out .= '        <p id="contact_pmessage">'."\n";
      $out .= '            <label for="message" style="vertical-align:top"    >'.$this->get_message('corps').'</label>'."\n";
      $out .= '            <textarea id="message" name="message" tabindex="6"'.($this->getOption('width')>0?' cols="'.$this->getOption('width'):'').'" rows="'.$this->getOption('length').'">'.$message.'</textarea>'."\n";
      $out .= '        </p>'."\n";
      $out .= '    </fieldset>'."\n";
            self::$cms->doevent(eCaptcha,eBefore,$out,true);
      $out .= '    <div style="text-align:center;"><input type="submit" name="envoi" value="'.$this->get_message('envoyer').'" /></div>'."\n";
      $out .= '</form>'."\n";
        };
        return $out;
    }
}
?>

Hors ligne

#4 01/02/2019 18:06:41

jpg
Administrateurs
Inscription : 19/11/2008
Messages : 2 086
Site Web

Re : fORMULAIRE CONTACT

Normalement, avec cette modif tu devrais avoir deux cas:
- le courriel part normalement et tu as le message comme quoi le courrier est bien parti
- le courrier ne part part et tu restes sur le formulaire avec affichage d'un message d'avertissement.

Avec cette version modifiée, tu as lequel des deux cas ?



bernard a écrit :

Bonjour Jean Paul,

Mon problème est toujours là !

Je n'y connais rien en PHP ! par le FTP j'ai récupéré le fichier "contact.php", rapatrié sur mon ordinateur,  modifié sur le BlocNotes et remis dans le dossier par le FTP.

J'ai fait un copier coller de la function et modifier la ligne citée dans ta réponset. et j'ai remis le tout en place.

J'ai très certainement du faire une bêtise mais laquelle ?

Je joints ci-dessous le fichier "contact.php".

Si cela peut être utile je suis prêt à fournir mes codes d'accès du site et de chez FREE

Cordialement

Hors ligne

#5 01/02/2019 19:11:33

bernard
Membre
Lieu : Nemours
Inscription : 14/06/2011
Messages : 38

Re : fORMULAIRE CONTACT

Je suis dans le premier cas.

Le courrier part normalement après quelques instants (2 secondes environ) après avoir cliquer sur Envoyer. Le formulaire s'efface et apparait le message disant que mon formulaire est parti.

Sauf qu'il n'arrive jamais.

J'ai plusieurs adresses "courriel" J'ai changé celles-ci dans le module "contact" On ne sait pas si FREE fait la gueule à Gmail, ou à Laposte mais ça ne fonctionne pas non plus avec mon adresse Free.

J'ai fait la même chose pour remplir le formulaire

Mais toujours pas de réception.

J'ai aussi modifié le fichier .Hatccess car il parait que Free à changer de version PHP. J'ai remplacé PHP 1 par Php56 1 comme dit sur certains sites.

Dernière modification par bernard (01/02/2019 19:13:38)

Hors ligne

#6 01/02/2019 19:57:00

jpg
Administrateurs
Inscription : 19/11/2008
Messages : 2 086
Site Web

Re : fORMULAIRE CONTACT

Free a peut-être encore changé quelque chose sur ses serveurs mail (mais sans mettre une configuration correcte malheureusement)

Tu as le délai d'environ deux secondes, cela veut dire que tu as correctement intégré le code.
Le délai de deux secondes ayant été déterminé expérimentalement, peut-être en augmentant un peu la valeur d'attente.
Pour cela, remplacer dans la fonction MailFree() la ligne

   return $resultat & ($time>1);

par

   return $resultat & ($time>2);

a+
Jean-Paul

Hors ligne

#7 01/02/2019 23:55:55

bernard
Membre
Lieu : Nemours
Inscription : 14/06/2011
Messages : 38

Re : fORMULAIRE CONTACT

Me revoilà,

Tentative infructueuse ! L>a modification de     return $resultat & ($time>1);   avec la valeur 2 me met le message d'erreur "envoi du mail échoué" et me garde mon formulaire ouvert comme expliqué sur ton avant dernier message.

J'ai fait plusieurs tentatives  en tant qu'administrateur (connecté sans captcha) et en tant que visiteur non inscrit (avec captcha)
à chaque fois échec avec la formule return $resultat & ($time>2); et mon message de non distribution
à chaque fois avec laformule return $resultat & ($time>1); message envoyé avec ou sans connection mais no arrivé.

J'ai oublié de te dire que je suis avec la version de Ziteplus estampillée 0.9.6 (Cela pourrait-il venir de là ????

J'en perd mon latin (qui est bien pauvre)

Hors ligne

#8 02/02/2019 00:36:06

jpg
Administrateurs
Inscription : 19/11/2008
Messages : 2 086
Site Web

Re : fORMULAIRE CONTACT

bernard a écrit :

J'ai oublié de te dire que je suis avec la version de Ziteplus estampillée 0.9.6 (Cela pourrait-il venir de là ????

Non, même si j'aurais préféré: le problème serait déjà résolu wink
Peu d'espoir de solution: ce problème touche tous les CMS chez Free (wordpress, joomla etc) et la seule solution connue était MailFree().
Depuis quelques temps de nombreux clients Free sont aussi touchés et se plaignent sur les groupes de discussions de pertes de mails.


Pour contourner le problème, deux solutions:

- intégrer un formulaire externe à Free avec un iFrame et/ou par javascript.
Par exemple pour : JotForm le code à insérer dans la page ressemblera à <script type="text/javascript" src="https://form.jotform.co/jsform/7xxxxxxxx8"></script>)

- changer d'hébergeur: c'est un peu radical mais l'hebergement Free n'est plus ce qu'il était et des problèmes simples deviennent insoluble sad
un petit exemple des possibilités: https://www.hebergementweb.org/hosting/gratuit/view

a+
Jean-Paul

Hors ligne

#9 02/02/2019 00:42:40

bernard
Membre
Lieu : Nemours
Inscription : 14/06/2011
Messages : 38

Re : fORMULAIRE CONTACT

Bonsoir Jean Paul,

Merci de ton aide. Je vais essayer de me tourner vers un javascript. Quand j'avais mes sites en Html (avant Ziteplus) je me servais beaucoup de ces codes.

Je te tiendrais au courant

Encore merci pour ton aide et ton dévouement.

Bien à toi

Bernard

Hors ligne

Pied de page des forums