Aller au contenu

pb encodage - formulaire de contact


Sujets conseillés

Posté

Bonjour,

J'ai réalisé un formulaire de contact pour mon site. Il fonctionne correctement, le mail est bien envoyé mais à la réception dans mon client de messagerie, les caractères spéciaux tels que "à", "é" sont remplacés par "é" ou encore Ã". Quel est le bout de code à rajouter pour encoder correctement le mail de mon formulaire ?

voici mon code :

<?php
/*
********************************************************************************************
CONFIGURATION
********************************************************************************************
*/
// destinataire est votre adresse mail. Pour envoyer à plusieurs à la fois, séparez-les par une virgule
$destinataire = 'nom_AT_fai.com';


// Action du formulaire (si votre page a des paramètres dans l'URL)
// si cette page est index.php?page=contact alors mettez index.php?page=contact
// sinon, laissez vide
$form_action = '';

// Messages de confirmation du mail
$message_envoye = "Votre message a bien été envoyé";
$message_non_envoye = "L'envoi du mail a échoué, veuillez réessayer SVP.";

// Message d'erreur du formulaire
$message_formulaire_invalide = "Vérifiez que tous les champs soient bien remplis et que l'email soit sans erreur.";

/*
********************************************************************************************
FIN DE LA CONFIGURATION
********************************************************************************************
*/

/*
* cette fonction sert à nettoyer et enregistrer un texte
*/
function Rec($text)
{
$text = trim($text); // delete white spaces after & before text
if (1 === get_magic_quotes_gpc())
{
$stripslashes = create_function('$txt', 'return stripslashes($txt);');
}
else
{
$stripslashes = create_function('$txt', 'return $txt;');
}

// magic quotes ?
$text = $stripslashes($text);
$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 IsEmail($email)
{
$pattern = "^([a-z0-9_]|\\-|\\.)+@(([a-z0-9_]|\\-)+\\.)+[a-z]{2,7}$";
return (eregi($pattern,$email)) ? true : false;
};

$err_formulaire = false; // sert pour remplir le formulaire en cas d'erreur si besoin

// si formulaire envoyé, on récupère tous les champs. Sinon, on initialise les variables.
$civilite = (isset($_POST['civilite'])) ? Rec($_POST['civilite']) : '';
$nom = (isset($_POST['nom'])) ? Rec($_POST['nom']) : '';
$prenom = (isset($_POST['prenom'])) ? Rec($_POST['prenom']) : '';
$email = (isset($_POST['email'])) ? Rec($_POST['email']) : '';
$telephone = (isset($_POST['telephone'])) ? Rec($_POST['telephone']) : '';
$lieu = (isset($_POST['lieu'])) ? Rec($_POST['lieu']) : '';
$secteur = (isset($_POST['secteur'])) ? Rec($_POST['secteur']) : '';
$objet = (isset($_POST['objet'])) ? Rec($_POST['objet']) : '';
$message = (isset($_POST['message'])) ? Rec($_POST['message']) : '';

if (isset($_POST['envoi']))
{
// On va vérifier les variables et l'email ...
$email = (IsEmail($email)) ? $email : ''; // soit l'email est vide si erroné, soit il vaut l'email entré
$err_formulaire = (IsEmail($email)) ? false : true;

if (($nom != '') && ($email != '') && ($objet != '') && ($message != ''))
{
// les 4 variables sont remplies, on génère puis envoie le mail
$headers = 'From: '.$prenom.' '.$nom.' <'.$email.'>' . "\r\n";
$contenu = "Civilité : ".stripslashes($civilite)."\n\n";
$contenu .= "Nom : ".stripslashes($nom)."\n\n";
$contenu .= "Prénom : ".stripslashes($prenom) ."\n\n";
$contenu .= "Téléphone : ".stripslashes($telephone) ."\n\n";
$contenu .= "Lieu d'implantation géographique : ".stripslashes($lieu) ."\n\n\n";
$contenu .= "Message :"."\n\n".stripslashes( $message);

$cible = $destinataire;


// Remplacement de certains caractères spéciaux
$contenu = html_entity_decode($contenu);
$contenu = str_replace(''',"'",$contenu);
$contenu = str_replace('’',"'",$contenu);
$contenu = str_replace('<br>','',$contenu);
$contenu = str_replace('<br />','',$contenu);

// Envoi du mail

if (mail($cible, $objet, $contenu, $headers))
{
echo '<p>'.$message_envoye.'</p>'."\n";
}
else
{
echo '<p>'.$message_non_envoye.'</p>'."\n\n\n";
echo "<a href='http://www.entreprendre.midipyrenees.fr/spip.php?auteur1003'>Retourner au formulaire de contact</a>";
};
}
else
{
// une des 3 variables (ou plus) est vide ...
echo '<p>'.$message_formulaire_invalide.' <a href="contact.php">Retour au formulaire</a></p>'."\n";
$err_formulaire = true;
};
}; // fin du if (!isset($_POST['envoi']))

if (($err_formulaire) || (!isset($_POST['envoi'])))
{
// afficher le formulaire
echo '<form style="padding: 5px 5px 5px 5px;" id="contact" method="post" action="'.$form_action.'">'."\n";
echo ' <fieldset><legend>Vos coordonnées</legend>'."\n";

echo ' <p>'."\n";
echo ' <label for="civilite">Civilité :</label>'."\n";
echo ' <select id="civilite" name="civilite" value="'.stripslashes($civilite).'" tabindex="1" />
<option selected="selected">M.</option>
<option>Mme</option>
<option>Melle</option>
</select>'."\n";
echo ' </p>'."\n";

echo ' <p>'."\n";
echo ' <label for="nom">Nom :</label>'."\n";
echo ' <input type="text" id="nom" name="nom" value="'.stripslashes($nom).'" tabindex="2" />'."\n";
echo ' </p>'."\n";

echo ' <p>'."\n";
echo ' <label for="prenom">Prénom :</label>'."\n";
echo ' <input type="text" id="prenom" name="prenom" value="'.stripslashes($prenom).'" tabindex="3" />'."\n";
echo ' </p>'."\n";

echo ' <p>'."\n";
echo ' <label for="email">Email :</label>'."\n";
echo ' <input type="text" id="email" name="email" value="'.stripslashes($email).'" tabindex="4" />'."\n";
echo ' </p>'."\n";


echo ' <p>'."\n";
echo ' <label for="telephone">Téléphone :</label>'."\n";
echo ' <input type="text" id="telephone" name="telephone" value="'.stripslashes($telephone).'" tabindex="5" />'."\n";
echo ' </p>'."\n";

echo ' <p>'."\n";
echo ' <label for="lieu">Lieu d\'implantation géographique :</label>'."\n";
echo ' <input type="text" id="lieu" name="lieu" value="'.stripslashes($lieu).'" tabindex="6" />'."\n";
echo ' </p>'."\n";

echo ' <label for="secteur">Secteur d\'activité :</label>'."\n";
echo ' <select id="secteur" name="secteur" value="'.stripslashes($secteur).'" tabindex="7" />
<option selected="selected">Textile</option>
<option>Batiment</option>
<option>TIC</option>
</select>'."\n";
echo ' </p>'."\n";
echo ' </fieldset>'."\n";

echo ' <fieldset><legend>Votre message :</legend>'."\n";
echo ' <p>'."\n";
echo ' <label for="objet">Objet :</label>'."\n";
echo ' <input type="text" id="objet" name="objet" value="'.stripslashes($objet).'" tabindex="8" />'."\n";
echo ' </p>'."\n";
echo ' <p>'."\n";
echo ' <label style="float:left; padding-right:4px" for="message">Message :</label>'."\n";
echo ' <textarea id="message" name="message" tabindex="9" cols="30" rows="8">'.stripslashes($message).'</textarea>'."\n";
echo ' </p>'."\n";
echo ' </fieldset>'."\n";

echo ' <div style="text-align:center;"><input type="submit" name="envoi" value="Envoyer le formulaire !" /></div>'."\n";
echo '</form>'."\n";
};
?>

J'ai essayé avec htmlentities et écumé plusieurs forums, je n'ai rien trouvé...

Je débute en PHP et je m'y casse les dents là.

Je précise que mon site est réalisé sous SPIP (si ça peut avoir une incidence...)

D'avance merci pour votre réponse

Posté

je n'ai pas vu de définition d'encodage dans ton envoi de mel et ton problème est typiquement un tel problème : mélange de utf-8 reconnu en iso ou le contraire

Posté

En effet, ce que tu reçois montre que c'est de l'UTF-8 interprété comme de l'ISO-8859-1.

Ajoute un header Content-Type: text/plain; charset=UTF-8 (ou text/html si c'est du HTML, mais je ne crois pas que ce soit le cas), et ça devrait fonctionner correctement.

Jacques.

Posté (modifié)

En effet, ce que tu reçois montre que c'est de l'UTF-8 interprété comme de l'ISO-8859-1.

Ajoute un header Content-Type: text/plain; charset=UTF-8 (ou text/html si c'est du HTML, mais je ne crois pas que ce soit le cas), et ça devrait fonctionner correctement.

Jacques.

Merci pour vos réponses.

J'ai rajouté la ligne

 $headers .= 'Content-type: text/plain; charset=UTF-8' . "\r\n";

dans mon code.

L'encodage est bon à présent sauf pour l'objet du mail qui prend le mauvais encodage pour les caractères spéciaux. J'ai essayé de comprendre pourquoi mais je sèche. D'où cela peut-il venir ?

Merci d'avance

Modifié par Antho03
Posté

encode ton objet en utf-8 avant de l'envoyer, lui aussi

Je reviens vers vous. Je ne trouve pas la bonne ligne de code à ajouter. J'ai mis

$objet .= 'Content-type: text/plain; charset=UTF-8' . "\r\n";

mais ce n'est pas ça.

Pouvez-vous m'indiquer quelle ligne il faut mettre svp ?

Désolé d'être une buse en PHP :(

Merci

Posté

Je viens de trouver.

Il fallait rajouter la ligne

$objet = utf8_decode($objet);

Mon formulaire est enfin fonctionnel !

Merci beaucoup à vous 2 de m'avoir aidé.

Posté (modifié)

Je reviens vers vous car mon problème n'est pas réglé entièrement.

Je me suis aperçu que le header de mon mail ne gérait pas les caractères spéciaux... :(

J'ai essayé de rajouter

$nom = utf8_decode($nom);

et

$prenom = utf8_decode($prenom);

mais si je mets cette ligne dans mon code, le header est ok mais les caractères spéciaux ne sont plus gérés dans le corps du mail pour le nom et le prénom.

j'ai un peu modifié mon code, je vous le remets :

<?php
/*
********************************************************************************************
CONFIGURATION
********************************************************************************************
*/
// destinataire est votre adresse mail. Pour envoyer à plusieurs à la fois, séparez-les par une virgule
$destinataire = 'nom_AT_fai.com';


// Action du formulaire (si votre page a des paramètres dans l'URL)
// si cette page est index.php?page=contact alors mettez index.php?page=contact
// sinon, laissez vide
$form_action = '';

// Messages de confirmation du mail
$message_envoye = "Votre message a bien été envoyé";
$message_non_envoye = "L'envoi du mail a échoué, veuillez réessayer SVP.";

// Message d'erreur du formulaire
$message_formulaire_invalide = "Vérifiez que tous les champs soient bien remplis et que l'email soit sans erreur.";

/*
********************************************************************************************
FIN DE LA CONFIGURATION
********************************************************************************************
*/

/*
* cette fonction sert à nettoyer et enregistrer un texte
*/
function Rec($text)
{
$text = trim($text); // delete white spaces after & before text
if (1 === get_magic_quotes_gpc())
{
$stripslashes = create_function('$txt', 'return stripslashes($txt);');
}
else
{
$stripslashes = create_function('$txt', 'return $txt;');
}

// magic quotes ?
$text = $stripslashes($text);
$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 IsEmail($email)
{
$pattern = "^([a-z0-9_]|\\-|\\.)+@(([a-z0-9_]|\\-)+\\.)+[a-z]{2,7}$";
return (eregi($pattern,$email)) ? true : false;
};

$err_formulaire = false; // sert pour remplir le formulaire en cas d'erreur si besoin

// si formulaire envoyé, on récupère tous les champs. Sinon, on initialise les variables.
$civilite = (isset($_POST['civilite'])) ? Rec($_POST['civilite']) : '';
$nom = (isset($_POST['nom'])) ? Rec($_POST['nom']) : '';
$prenom = (isset($_POST['prenom'])) ? Rec($_POST['prenom']) : '';
$email = (isset($_POST['email'])) ? Rec($_POST['email']) : '';
$telephone = (isset($_POST['telephone'])) ? Rec($_POST['telephone']) : '';
$lieu = (isset($_POST['lieu'])) ? Rec($_POST['lieu']) : '';
$secteur = (isset($_POST['secteur'])) ? Rec($_POST['secteur']) : '';
$projet = (isset($_POST['projet'])) ? Rec($_POST['projet']) : '';
$message = (isset($_POST['message'])) ? Rec($_POST['message']) : '';



if (isset($_POST['envoi']))
{
// On va vérifier les variables et l'email ...
$email = (IsEmail($email)) ? $email : ''; // soit l'email est vide si erroné, soit il vaut l'email entré
$err_formulaire = (IsEmail($email)) ? false : true;

if (($nom != '') && ($email != '') && ($projet != '') && ($lieu != '') && ($secteur != '') && ($message != ''))
{
// les 4 variables sont remplies, on génère puis envoie le mail

$headers = 'MIME-Version: 1.0' . "\r\n";
$headers .= 'Content-type: text/plain; charset=UTF-8' . "\r\n";
$headers .= 'From: '.$prenom.' '.$nom.' <'.$email.'>' . "\r\n";


$contenu = "Civilité : ".stripslashes($civilite)."\n\n";
$contenu .= "Nom : ".stripslashes($nom)."\n\n";
$contenu .= "Prénom : ".stripslashes($prenom) ."\n\n";
$contenu .= "Téléphone : ".stripslashes($telephone) ."\n\n";
$contenu .= "Type de projet : ".stripslashes($projet) ."\n\n";
$contenu .= "Lieu d'implantation géographique : ".stripslashes($lieu) ."\n\n";
$contenu .= "Secteur d'activité : ".stripslashes($secteur) ."\n\n\n";
$contenu .= "Message :"."\n\n".stripslashes( $message);


$cible = $destinataire;
$objet2 = "Demande d'informations - formulaire site web";
$objet = utf8_decode($objet2);

// Remplacement de certains caractères spéciaux
$contenu = html_entity_decode($contenu);
$contenu = str_replace(''',"'",$contenu);
$contenu = str_replace('’',"'",$contenu);
$contenu = str_replace('<br>','',$contenu);
$contenu = str_replace('<br />','',$contenu);

// Envoi du mail

if (mail($cible, $objet, $contenu, $headers))
{
echo '<p style="padding:8px 0 8px 5px;">'.$message_envoye.'</p>'."\n";
}
else
{
echo '<p>'.$message_non_envoye.'</p>'."\n\n\n";

};
}
else
{
// une des 3 variables (ou plus) est vide ...
echo '<p style="padding-left:5px;">'.$message_formulaire_invalide.'</p>'."\n";
$err_formulaire = true;
};
}; // fin du if (!isset($_POST['envoi']))

?>



<?php
if (($err_formulaire) || (!isset($_POST['envoi'])))
{
// afficher le formulaire
echo '<form style="padding: 0px 5px 5px 5px;" id="contact" method="post" action="'.$form_action.'">'."\n";



echo ' <fieldset><legend style="color:#333"><b>Vos coordonnées</b></legend>'."\n";?>

<table width="500" border="0" cellspacing="8" cellpadding="0" style="padding-left:60px;">
<tr><td>
<label for="civilite">Civilité* :</label></td>
<td><select id="civilite" name="civilite" value="<? '.stripslashes($civilite).' ?>" tabindex="1" />
<option selected="selected">M.</option>
<option>Mme</option>
<option>Melle</option>
</select>
</td></tr>

<tr><td>
<label for="nom">Nom* :</label></td>
<td><input type="text" id="nom" name="nom" value="<? '.stripslashes($nom).' ?>" tabindex="2" /></td></tr>

<tr>
<td><label for="prenom">Prénom :</label></td>
<td><input type="text" id="prenom" name="prenom" value="<? '.stripslashes($prenom).' ?>" tabindex="3" /></td></tr>

<tr><td>
<label for="email">Email* :</label></td>
<td><input type="text" id="email" name="email" value="<? '.stripslashes($email).' ?>" tabindex="4" /></td></tr>

<tr><td>
<label for="telephone">Téléphone :</label></td>
<td><input type="text" id="telephone" name="telephone" value="<? '.stripslashes($telephone).'?>" tabindex="5" /></td></tr>

<tr><td>
<label for="projet">Type de projet* :</label></td>
<td><select id="projet" name="projet" value="<? '.stripslashes($projet).'?>" tabindex="7" />
<option selected="selected">création d'entreprise</option>
<option>reprise d'entreprise</option>
<option>transmission d'entreprise</option>
<option>autres</option>
</select></td></tr>


<tr><td align="left">
<label for="lieu">Lieu d'implantation géographique* :</label></td>
<td><input type="text" id="lieu" name="lieu" value="<? '.stripslashes($lieu).'?>" tabindex="6" /></td></tr>

<tr><td>
<label for="secteur">Secteur d'activité* :</label></td>
<td><input type="text" id="secteur" name="secteur" value="<? '.stripslashes($secteur).'?>" tabindex="6" /></td></tr>


</table>

</fieldset>

<fieldset style="padding-top:10px">


<legend style="color: #333"><i><b>Décrivez ici votre projet en quelques lignes ainsi que l'objet de votre demande</b></i></legend>


<table width="500" border="0" cellspacing="0" cellpadding="0" style="padding-top:10px">

<tr><td valign="top"style="padding-left:59px;">
<label for="message">Message* :</label></td>
<td style="padding-left:8px;"><textarea id="message" name="message" tabindex="9" cols="45" rows="8"><? '.stripslashes($message).'?></textarea></td></tr>

</table>
</fieldset>
<span style="padding:3px 0 3px 1px; color:#BB0F0B; font-size: 10px"><?php echo "Les champs pourvus d'une * doivent être remplis";?></span>
<div style="text-align:center;"><input type="submit" name="envoi" value="Envoyer " /></div>
</form>
<? };
?>

Merci d'avance

Modifié par Antho03
Posté

Mets les utf8_decode autour de $nom et $prenom directement dans la ligne où tu composes le "From".

Note que même si ça marche dans ton cas particulier, ce n'est pas la "bonne vraie méthode qui marche à tous les coups". La bonne méthode est bien d'utiliser des encoded words (normalement mb_encode_mimeheader mais les commentaires laissent penser que la fonction est bugguée).

Jacques.

Posté

Mets les utf8_decode autour de $nom et $prenom directement dans la ligne où tu composes le "From".

Note que même si ça marche dans ton cas particulier, ce n'est pas la "bonne vraie méthode qui marche à tous les coups". La bonne méthode est bien d'utiliser des encoded words (normalement mb_encode_mimeheader mais les commentaires laissent penser que la fonction est bugguée).

Jacques.

C'est ok.

la ligne modifiée est

$headers .= 'From: '.utf8_decode($prenom).' '.utf8_decode($nom).' <'.$email.'>' . "\r\n";

(si ça peut servir à d'autres personnes)

Merci beaucoup pour votre aide !

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...