Bonjour,
Les caractères accentués saisis dans un formulaire envoyés par la fonction PHP mail() ne s'affichent pas.
Le site sur lequel se trouve ce problème est en ligne ici. Pour lancer le formulaire il faut aller dans l'enpied sur le lien Contact.
J'ai pourtant l'instruction <meta> qui va bien dans le template:
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8">
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
et j'ai également les bons entêtes dans la fonction mail():
$msg .= 'Nom: '.$nom."\n";
$msg .= 'Prénom: '.$prenom."\n";
$msg .= 'Mel: '.$expediteur."\n";
$msg .= 'Rue: '.$rue."\n";
$msg .= 'CP: '.$cp."\n";
$msg .= 'Ville: '.$ville."\n";
$msg .= 'Téléphone: '.$telephone."\n";
$msg .= 'Message: '.$message."\n";
$destinataire .= 'pascal.gonthier@pierriere-gonthier.com';
$objet .= 'Fiche de contact';
//$mailheaders .= 'De: Domaine Pierrière-Gonthier'."\n";
$mailheaders .= 'Content-Type: text/html; charset="utf-8"'."\n";
$mailheaders .= 'Content-Transfer-Encoding: 8bit'."\n";
}
if(mail($destinataire, $objet, $msg, $mailheaders)){
if(lang=="fr"){
$ok='Le formulaire est bien remplie. Le message a été envoyé.';
}else{
$ok='Form has been filled properly. The message has been sent';
}
setcookie("Envoyer", "1", time() + 120); /* On créé un cookie de courte durée (ici 120 secondes) pour éviter de renvoyer un mail en rafraichissant la page */
unset($_POST); /* On détruit les variables $_POST */
session_unset (); /* On détruit les variables $_SESSION */
session_destroy (); /* On détruit la session */
}
Quelqu'un aurait-il une idée ?
Cordialement.
Tu n'es pas le seul à avoir eu ce problème.
D'après les autres forum, pour éviter ce genre de problème tu dois envoyer le message en ISO-8859-1
$msg .= 'Nom: '.$nom."\n";
$msg .= 'Prénom: '.$prenom."\n";
$msg .= 'Mel: '.$expediteur."\n";
$msg .= 'Rue: '.$rue."\n";
$msg .= 'CP: '.$cp."\n";
$msg .= 'Ville: '.$ville."\n";
$msg .= 'Téléphone: '.$telephone."\n";
$msg .= 'Message: '.$message."\n";
$destinataire .= '...';
$objet .= 'Fiche de contact';
//$mailheaders .= 'De: ...'."\n";
$mailheaders .= 'Content-Type: text/html; charset="iso-8859-1"'."\n"; // <- encodage : ISO-8859-1
$mailheaders .= 'Content-Transfer-Encoding: 8bit'."\n";
}
if(mail($destinataire, utf8_decode($objet), utf8_decode($msg), $mailheaders)){ // utf8_decode(..) transforme l'uft8 en ISO-8859-1
if(lang=="fr"){
$ok='Le formulaire est bien remplie. Le message a été envoyé.';
}else{
$ok='Form has been filled properly. The message has been sent';
}
setcookie("Envoyer", "1", time() + 120); /* On créé un cookie de courte durée (ici 120 secondes) pour éviter de renvoyer un mail en rafraichissant la page */
unset($_POST); /* On détruit les variables $_POST */
session_unset (); /* On détruit les variables $_SESSION */
session_destroy (); /* On détruit la session */
}
Bonjour jo-jo-123,
Je teste et je reviens ensuite.
Bonne journée,
Cordialement.
Bonjour et merci pour vos réponses.
Toujours le même problème malgré les changements proposés par Jo que j'ai mis en place. Voici le message que je reçois :
Nom: idlas
Prénom: philippe
Mel: philippe.idlas@free.fr
Rue: du docteur p%C3%A9lagie
CP: 91850
Ville: M%C3%A9r%C3%A9ville
Téléphone: 0160827443
Message: %C3%A9
Les caractères accentués de Prénom et de Téléphone sont bien orthographiés avec la fonction utf8_decode() mais le contenue des variables PHP, elles ne le sont pas. J'ai essayé d'ajouté la fonction utf8_decode() au niveau des variables mais cela ne change rien.
Le caractère qui devrait s'afficher dans Message est un é.
D'autres pistes ?
Cordialement.
et tu génères comment tes variables $message, ....
$message = $_POST'message'];
Ou tu fais quelque chose d'autre ?
Bonjour JO,
Voici pour répondre à ta question le programme PHP de traitement et d'envoi du message :
<?php
session_start ();
/* Initialiser les variables */
$ok = ''; $alert = ''; $msg = ''; $destinataire = ''; $objet = ''; $mailheaders = '';
/* Si le formulaire est envoyé alors on fait les traitements */
if(isset($_GET'Envoyer'])){
/* Récupération des valeurs des champs du formulaire */
if(get_magic_quotes_gpc()){
$nom = stripslashes(trim($_GET'nom']));
$prenom = stripslashes(trim($_GET'prenom']));
$expediteur = stripslashes(trim($_GET'mel']));
$expediteur = urldecode($expediteur);
$rue = stripslashes(trim($_GET'rue']));
$cp = stripslashes(trim($_GET'cp']));
$ville = stripslashes(trim($_GET'ville']));
$telephone = stripslashes(trim($_GET'telephone']));
$message = stripslashes(trim($_GET'commentaire']));
}else{
$nom = trim($_GET'nom']);
$prenom = trim($_GET'prenom']);
$expediteur = trim($_GET'mel']);
$expediteur = urldecode($expediteur);
$rue = trim($_GET'rue']);
$cp = trim($_GET'cp']);
$ville = trim($_GET'ville']);
$telephone = trim($_GET'telephone']);
$message = trim($_GET'commentaire']);
}
/* Construction des variables de session */
$_SESSION'nom'] = $nom;
$_SESSION'prenom'] = $prenom;
$_SESSION'mel'] = $expediteur;
$_SESSION'rue'] = $rue;
$_SESSION'cp'] = $cp;
$_SESSION'ville'] = $ville;
$_SESSION'telephone'] = $telephone;
$_SESSION'commentaire'] = $message;
/* Expression régulière permettant de vérifier si le format d'une adresse e-mail est correct */
$regex_mail = '/^-+.\w]{1,64}@-.\w]{1,64}\.-.\w]{2,6}$/i';
/* Expression régulière permettant de vérifier qu'aucun en-tête n'est inséré dans nos champs */
$regex_head = '/\n\r]/';
/* Si le formulaire n'est pas posté de notre site on renvoie vers la page d'accueil */
}else{
header('Location: http://pierriere-gonthier.com/index');
}
/* On vérifie que les champs obligatoires sont remplis */
if(empty($nom) || empty($prenom) || empty($expediteur)){
if(lang=="fr"){
$alert.='<li>Les champs marqués d\'un astérisque(*) doivent être remplis.</li>';
}else{
$alert.='<li>Fields marked with an asterisk(*) are required.</li>';
}
}elseif(!preg_match($regex_mail, $expediteur)){ /* On vérifie que le format de l'e-mail est correct */
if(lang=="fr"){
$alert.='<li>L\'adresse '.$expediteur.' n\'est pas valide.</li>';
}else{
$alert.='<li>Email '.$expediteur.' is not valid.</li>';
}
}elseif(preg_match($regex_head, $nom) || preg_match($regex_head, $prenom) || preg_match($regex_head, $expediteur)
|| preg_match($regex_head, $rue) || preg_match($regex_head, $cp) || preg_match($regex_head, $ville)
|| preg_match($regex_head, $telephone)){ /* On vérifie qu'il n'y a aucun header dans les champs */
if(lang=="fr"){
$alert.='<li>Les en-têtes sont interdites dans les champs du formulaire.</li>';
}else{
$alert.='<li>Headers are not authorised in the fields.</li>';
}
}elseif(!isset($_COOKIE'Envoyer'])){ /* Si aucun problème et aucun cookie créé, on construit le message et on envoie l'e-mail */
$msg .= 'Nom: '.$nom."\r\n";
$msg .= 'Prénom: '.$prenom."\r\n";
$msg .= 'Mel: '.$expediteur."\r\n";
$msg .= 'Rue: '.$rue."\r\n";
$msg .= 'CP: '.$cp."\r\n";
$msg .= 'Ville: '.$ville."\r\n";
$msg .= 'Téléphone: '.$telephone."\r\n";
$msg .= 'Message: '.$message."\r\n";
$destinataire .= 'pascal.gonthier@pierriere-gonthier.com';
$objet .= 'Fiche de contact';
//$mailheaders = 'MIME-Version: 1.0' . "\r\n";
$mailheaders .= 'Content-type: text/html; charset=iso-8859-1'."\r\n";
$mailheaders .= 'Content-Transfer-Encoding: 8bit'."\r\n";
//$mailheaders .= 'De: Domaine Pierrière-Gonthier'."\r\n";
}
if(mail($destinataire, $objet, nl2br(utf8_decode($msg)), $mailheaders)){
if(lang=="fr"){
$ok='Le formulaire est bien remplie. Le message a été envoyé.';
}else{
$ok='Form has been filled properly. The message has been sent';
}
setcookie("Envoyer", "1", time() + 120); /* On créé un cookie de courte durée (ici 120 secondes) pour éviter de renvoyer un mail en rafraichissant la page */
unset($_POST); /* On détruit les variables $_POST */
session_unset (); /* On détruit les variables $_SESSION */
session_destroy (); /* On détruit la session */
}
if(!empty($alert)){
$_SESSION'alert']=$alert;
header('Location: http://pierriere-gonthier.com/alertformulaire');
}else{
$_SESSION'ok']=$ok;
header('Location: http://pierriere-gonthier.com/okformulaire');
}
?>
Merci pour ton aide.
Je continue de chercher de mon côté mais je n'ai rien trouvé de concluant sauf des façons de faire trop compliqués pour moi notamment sur le très bon forum de stackoverflow.com. Dommage !
Cordialement.
Jo et Grafikart,
Voici comment j'ai résolu mon problème. Utilisation combinée des fonctions urlencode et utf8_decode et suppression de l'entête du message. Cela fonctionne donc en envoyant le message en texte. Pour l'instant cela me convient. Cependant, le problème reste entier si utilisation de l'entête du message avec un charset. Je suis donc toujours intéressé par une solution avec l'envoi d'un entête.
elseif(!isset($_COOKIE'Envoyer'])){ /* Si aucun problème et aucun cookie créé, on construit le message et on envoie l'e-mail */
$msg .= 'Nom: '.$nom."\r\n";
$msg .= 'Prénom: '.$prenom."\r\n";
$msg .= 'Mel: '.$expediteur."\r\n";
$msg .= 'Rue: '.urldecode($rue)."\r\n";
$msg .= 'CP: '.$cp."\r\n";
$msg .= 'Ville: '.urldecode($ville)."\r\n";
$msg .= 'Téléphone: '.$telephone."\r\n";
$msg .= 'Message: '.urldecode($message)."\r\n";
$destinataire .= 'pascal.gonthier@pierriere-gonthier.com';
$objet .= 'Fiche de contact';
$mailheaders = 'De: Domaine Pierrière-Gonthier'."\r\n";
//$mailheaders .= 'MIME-Version: 1.0' . "\r\n";
//$mailheaders .= 'Content-type: text/html; charset="iso-8859-1"'."\r\n";
//$mailheaders .= 'Content-Transfer-Encoding: 8bit'."\r\n";
}
if(mail($destinataire, $objet, nl2br(utf8_decode($msg)), $mailheaders)){
Merci pour votre aide.
Cordialement.