Un formulaire PHP qui me renvoie sur un site dont je ne veux pas.

Petit nouveau ! | 6 Messages

18 nov. 2021, 11:24

Bonjour,
Je ne débute pas en PHP, je n'y connais rien.
J'ai un site avec un formulaire (HTML/CSS) qui fait appel à un fichier PHP.
Voici le fichier au complet :
<?php
if(isset($_POST['email'])) {
 
    // EDIT THE 2 LINES BELOW AS REQUIRED
    $email_to = "mon adresse email";
    $email_subject = "New Message Received";
 
    function died($error) {
        // your error code can go here
        echo "We are very sorry, but there were error(s) found with the form you submitted. ";
        echo "These errors appear below.<br /><br />";
        echo $error."<br /><br />";
        echo "Please go back and fix these errors.<br /><br />";
        die();
    }
 
    // validation expected data exists
    if( !isset($_POST['email']) ||        
        !isset($_POST['comments'])) {
        died('We are sorry, but there appears to be a problem with the form you submitted.');       
    }
 
    $email_from = $_POST['email']; // required    
    $comments = $_POST['comments']; // required
 
    $error_message = "";
    $email_exp = '/^[A-Za-z0-9._%-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}$/';
  if(!preg_match($email_exp,$email_from)) {
    $error_message .= 'The Email Address you entered does not appear to be valid.<br />';
  }
    $string_exp = "/^[A-Za-z\s.'-]+$/";

  if(strlen($comments) < 2) {
    $error_message .= 'The Comments you entered do not appear to be valid.<br />';
  }
  if(strlen($error_message) > 0) {
    died($error_message);
  }
    $email_message = "Form details below.\n\n";
 
    function clean_string($string) {
      $bad = array("content-type","bcc:","to:","cc:","href");
      return str_replace($bad,"",$string);
    }
 
    $email_message .= "First Name: ".clean_string($first_name)."\n";
    $email_message .= "Last Name: ".clean_string($last_name)."\n";
    $email_message .= "Email: ".clean_string($email_from)."\n";   
    $email_message .= "Comments: ".clean_string($comments)."\n";
 
// create email headers
$headers = 'From: '.$email_from."\r\n".
'Reply-To: '.$email_from."\r\n" .
'X-Mailer: PHP/' . phpversion();
@mail($email_to, $email_subject, $email_message, $headers);
echo "<meta http-equiv='refresh' content=\"0; url=site que je ne désire pas\">";
?>
 
<?php
}
?>
Ci je remplace l'url : "le site dont je ne veux pas" par celle de mon site, je tombe sur une page blanche après validation du formulaire.
L'idéal, serait de ne pas renvoyer la page sur un site mais de rester sur la page sur laquelle on était.
Merci pour votre aide,
rd

Eléphant du PHP | 337 Messages

18 nov. 2021, 11:57

Il date un peu ce code, il y a pas mal de trucs qui seraient sérieusement améliorables, mais bon. Pour ce qui est de la redirection, il serait plus judicieux d'utiliser un header('Location: page.html') plutôt qu'une redirection avec balise meta.

Il faut donc remplacer ça :

Code : Tout sélectionner

echo "<meta http-equiv='refresh' content=\"0; url=site que je ne désire pas\">"
...par ça :

Code : Tout sélectionner

header('Location: mapage.html'); exit;
Le problème c'est que s'il y a une erreur dans la soumission du formulaire, il y a des echo qui envoient du texte, et du coup ça fera planter la redirection header.
En fait, le formulaire en lui-même serait à revoir !

Petit nouveau ! | 6 Messages

18 nov. 2021, 12:27

Merci beaucoup finipe, je tenterai dès ce soir.
Bonne journée,
rd

Petit nouveau ! | 6 Messages

18 nov. 2021, 12:30

comme cela ?
// create email headers
$headers = 'From: '.$email_from."\r\n".
'Reply-To: '.$email_from."\r\n" .
'X-Mailer: PHP/' . phpversion();
@mail($email_to, $email_subject, $email_message, $headers);
header('Location: mapage.html');
exit;
?>

<?php
}
?>

Petit nouveau ! | 6 Messages

18 nov. 2021, 12:33

Et les commentaires (qui arrivent bien à destination) sont placés dans les "spams" ou "promotions".
Y'a t'il une ligne à changer ?
Encore MERCI,
rd

Eléphant du PHP | 337 Messages

18 nov. 2021, 14:29

Pour ne pas finir dans les spams c'est un peu plus délicat. Il faut essayer de respecter un maximum de préconisations, en ajoutant des headers dans le mail, comme par exemple : X-auth-smtp-user, X-abuse-contact, List-Unsubscribe si c'est une newsletter.
On peut aussi ajouter les normes de sécurité DMARC ou DKIM, mais ce n'est pas toujours possible selon l'hébergeur.

Un bon outil de test est le suivant : https://www.mail-tester.com/

Petit nouveau ! | 6 Messages

18 nov. 2021, 14:56

Merci pour ces précisions. Puis-je savoir où et comment placer des headers comme X-auth-smtp-user ou X-abuse-contact.
Ce n'est pas que je débute, simplement que je n'y connais rien. Merci pour ton aide finipe ;)

Eléphant du PHP | 337 Messages

18 nov. 2021, 15:43

Juste après le X-mailer c'est bien. Après ça fait pas tout, loin de là ! Il faut aussi que le contenu de ton email soit :

- bien rédigé
- juste syntaxiquement (si tu utilises du html notamment, il faut que tes balises soient bien ordonnées, fermées quand c'est nécessaire, etc.)
- éviter les spam words (genre "gratuit", "cadeau", etc.)
- que ton hébergeur n'ait pas une réputation de daube (donc déjà, évite les hébergeurs gratuits, parce que tous les spammeurs les utilisent)
- ne pas envoyer 200 mails en 1 seconde
- et probablement des tas d'autres trucs que chaque client mail est le seul à savoir

Petit nouveau ! | 6 Messages

18 nov. 2021, 18:43

Merci pour tous ces conseils, mais pouvez-vous me rédiger la ligne à remplacer ainsi que la nouvelle.
Pour le reste, rien de méchant, c'est juste un formulaire de contact pour un site perso que personne n'ira voir. Mais ça me plaît, excepté le PHP ;)
Encore merci et bonne soirée,
rd

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

18 nov. 2021, 19:25

Merci pour tous ces conseils, mais pouvez-vous me rédiger la ligne à remplacer ainsi que la nouvelle.
Bonjour Herde2,
PHPfrance est un forum d'entraide, mais nous ne sommes pas là pour faire le code à ta place mais pour expliquer comment faire et te guider dans la réalisation de ton projet.
Donc à toi d'essayer de le faire, de tester et si ça ne marche pas de revenir vers le forum. :D
Quand tout le reste a échoué, lisez le mode d'emploi...

Avatar du membre
Mammouth du PHP | 1564 Messages

20 nov. 2021, 02:18

Merci pour List-Unsubscribe, je ne connaissais pas ;)

Eléphant du PHP | 337 Messages

20 nov. 2021, 23:43

Merci pour List-Unsubscribe, je ne connaissais pas ;)
J'ai codé une newsletter il n'y a pas longtemps, et c'est un entête qui semble prisé par les clients mails !

Avatar du membre
Mammouth du PHP | 1564 Messages

21 nov. 2021, 00:48

[un peu hors sujet, désolé]
Tu veux bien mettre la ligne de code avec cette entête s'il te plaît ? Dire pourquoi tu l'utilise,... J'ai aussi créé un "système de newsletter", je vais peut être la rajouter.
[/hors sujet]

Eléphant du PHP | 337 Messages

21 nov. 2021, 15:37

Alors du coup, ça servira aussi au topic initial, tant qu'à faire :D

Voilà ce que je mets comme entête mails :

Code : Tout sélectionner

MIME-Version: 1.0\r\n Content-type: text/html; charset=UTF-8\r\n To: Jean-Jacques Destinataire <[email protected]>\r\n From: Dieu <[email protected]>\r\n Reply-To: [email protected]\r\n X-Mailer: PHP/".phpversion()."\r\n X-auth-smtp-user: [email protected]\r\n X-abuse-contact: [email protected]\r\n List-Unsubscribe: <mailto: [email protected]?subject=Désinscription newsletter, id client ".$_ID_CLIENT.">, <https://www.monsite.com/desinscription.php?id=".$_ID_CLIENT."&code=".$un_code_unique.">\r\n List-Unsubscribe-Post: List-Unsubscribe=One-Click\r\n
La page desinscription.php est codée de sorte que le simple fait d'aller sur cette page, avec en url l'id du client et une variable unique, permet la désinscription du client (c'est le fameux "one-click").

Pour la variable unique, je me suis pas trop fait chier : j'ai concaténé l'id client et sa date d'inscription, puis md5 le tout, et juste les 6 premiers caractères (c'est pas vraiment une donnée ultra sensible, c'est juste pour éviter une désinscription de quelqu'un qui ne veut pas être désinscrit)

Ça, plus quelques petits détails (email correctement rédigé et syntaxiquement juste, pas de balises craignos genre <script> ou <iframe>, pas de spamwords...), je suis à 8,9/10 sur mail-tester.

Eléphant du PHP | 337 Messages

21 nov. 2021, 15:43

J'ajoute que pour l'envoi de nombreux mails, je le fais par paquets de 50, à intervalles de 2 heures.
Et je n'utilise pas Cron, mais je profite des utilisateurs du site à leur insu : lorsque quelqu'un (quel qu'il soit) charge une page, je vérifie un timestamp, et si le timestamp en question est dépassé, alors boum j'envoie les 50 mails suivants, et je mets le timestamp à jour avec +2h. Comme ça, ce sont les internautes qui bossent pour moi, et j'ai pas besoin de m'embêter avec des taches Cron.