[RESOLU] nettoyer caractères à l'envoi

Eléphant du PHP | 172 Messages

19 mai 2014, 16:19

Bonjour :D

j'ai un script d'envoi mail que j'ai adapté à ce que je veux et tout fonctionne correctement sauf qu'à la réception des messages les caractères é à ç è etc... sont transformés dans la boite de réception:

Exemple:
bien le bonjour à tous les héros de PHP france qui maîtrise bien le PHP


Merci de l'aide par avance



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

// copie ? (envoie une copie au visiteur)
$copie = 'non';

// 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 = 'contact.php';

// Messages de confirmation du mail
$message_envoye = "<b style='color: red;'>Votre message nous est bien parvenu, merci </b>";
$message_non_envoye = "<b style='color: red;'>envoi du mail a échoué, veuillez réessayer SVP.</b>";

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


/*
 * cette fonction sert à nettoyer et enregistrer un texte
 */
function Rec($text)
{
	$text = htmlspecialchars(trim($text), ENT_QUOTES );
	if (1 === get_magic_quotes_gpc())
	{
		$text = stripslashes($text);
	}

	$text = nl2br($text);
	return $text;
};

/*
 * Cette fonction sert à vérifier la syntaxe d'un email
 */
function IsEmail($email)
{
	$value = preg_match('/^(?:[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+\.)*[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+@(?:(?:(?:[a-zA-Z0-9_](?:[a-zA-Z0-9_\-](?!\.)){0,61}[a-zA-Z0-9_-]?\.)+[a-zA-Z0-9_](?:[a-zA-Z0-9_\-](?!$)){0,61}[a-zA-Z0-9_]?)|(?:\[(?:(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\.){3}(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\]))$/', $email);
	return (($value === 0) || ($value === false)) ? false : true;
}

// formulaire envoyé, on récupère tous les champs.
$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'])      : '';
$objet      = (isset($_POST['objet']))      ? Rec($_POST['objet'])      : '';
$message    = (isset($_POST['message']))    ? Rec($_POST['message'])    : '';
$antispam_h = (isset($_POST['antispam_h'])) ? Rec($_POST['antispam_h']) : '';
$antispam_r = (isset($_POST['antispam_r'])) ? Rec($_POST['antispam_r']) : '';

// 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 = false; // sert pour remplir le formulaire en cas d'erreur si besoin

if (isset($_POST['envoi']))
{
	// On demande la vraie réponse
	$verif_nospam = NoSpamQuestion('ans', $antispam_r);

	if (strtolower($antispam_h) != strtolower($verif_nospam['answer']))
	{
		// le formulaire s'arrête ici
		echo '<b style="color: red;">Vous n\'avez pas répondu correctement à la question Antispam ...</b>';
	}
	else
	{
		if (($nom != '') &&($prenom != '') && ($telephone != '') && ($email != '') && ($objet != '') && ($message != ''))
		{
			// les 4 variables sont remplies, on génère puis envoie le mail
			$headers  = 'From:'.$nom.'  '.$prenom.'  '.$telephone.' <'.$email.'>' . "\r\n";
			//$headers .= 'Reply-To: '.$email. "\r\n" ;
			//$headers .= 'X-Mailer:PHP/'.phpversion();

			// envoyer une copie au visiteur ?
			if ($copie == 'non')
			{
				$cible = $destinataire.','.$email;
			}
			else
			{
				$cible = $destinataire;
			};

			// Remplacement de certains caractères spéciaux
			$message = str_replace("'","'",$message);
			$message = str_replace("&#8217;","'",$message);
			$message = str_replace(""",'"',$message);
			$message = str_replace('<br>','',$message);
			$message = str_replace('<br />','',$message);
			$message = str_replace("<","<",$message);
			$message = str_replace(">",">",$message);
			$message = str_replace("&","&",$message);
			
			// Envoi du mail
			if (mail($cible, $objet, $message, $headers))
			{
				echo '<p>'.$message_envoye.'</p>';
			}
			else
			{
				echo '<p>'.$message_non_envoye.'</p>';
			};
		}
		else
		{
			// une des 3 variables (ou plus) est vide ...
			echo '<p>'.$message_formulaire_invalide.'</p>';
			$err_formulaire = true;
		};
	};
}; // fin du if (!isset($_POST['envoi']))

if (($err_formulaire) || (!isset($_POST['envoi'])))



{
	// afficher le formulaire
	echo '
	<form id="contact-form" method="post" enctype="multipart/form-data">
	<fieldset><legend><b style="color: blue;">Vos coordonn&#233;es</b></legend><br/>
		<p><label for="nom">Nom:</label><input type="text" id="nom" name="nom" value="'.stripslashes($nom).'" tabindex="1" /></p> <br/>
		<p><label for="prenom">Pr&#233;nom:</label><input type="text" id="prenom" name="prenom" value="'.stripslashes($prenom).'" tabindex="2" /></p> <br/>
	    <p><label for="telephone">T&#233;lephone :</label><input type="text" id="telephone" name="telephone" value="'.stripslashes($telephone).'" tabindex="3" /></p>
		<p><label for="email">Email :</label><input type="text" id="email" name="email" value="'.stripslashes($email).'" tabindex="4" /></p>
		
	</fieldset>

	<fieldset><legend><b style="color: blue;">Votre message </b></legend><br/>
		<p><label for="objet">Objet du message :</label><input type="text" id="objet" name="objet" value="'.stripslashes($objet).'" tabindex="5" /></p><br/>
		<p><label for="message">Message :</label><textarea id="message" name="message" tabindex="6" cols="30" rows="8">'.stripslashes($message).'</textarea></p>
	</fieldset>  <br/>
	
	
	
	
	
	

	<fieldset><legend><b style="color: blue;">Antispam captcha</b></legend>
		<p><label for="antispam_h">'.$nospam['question'].'</label><input type="text" name="antispam_h" id="antispam_h" /><input type="hidden" name="antispam_r" value="'.$nospam['num'].'" /></p>
	</fieldset> 
	
	
	
	
	
	<form id="contact-form" method="post" enctype="multipart/form-data">
	

<div style="text-align:center;"><input type="submit" name="envoi" value="ENVOYER LE FORMULAIRE" />
     
	</form>';
	
	
};




    
?>

ViPHP
xTG
ViPHP | 7331 Messages

19 mai 2014, 17:27

C'est un problème d'encodage, tu envoies de l'utf-8 mais sans le préciser dans l'entête de l'email et donc il est interprété comme de l'iso.
L'utf-8 enregistre certains caractères sur deux octets tandis qu'en iso les caractères sont toujours sur un octet ce qui te procure cette interprétation.
Il y a un exemple dans la documentation qui joue avec l'encodage : http://fr2.php.net/manual/en/function.mail.php

Eléphant du PHP | 172 Messages

19 mai 2014, 18:46

C'est un problème d'encodage, tu envoies de l'utf-8 mais sans le préciser dans l'entête de l'email et donc il est interprété comme de l'iso.
L'utf-8 enregistre certains caractères sur deux octets tandis qu'en iso les caractères sont toujours sur un octet ce qui te procure cette interprétation.
Il y a un exemple dans la documentation qui joue avec l'encodage : http://fr2.php.net/manual/en/function.mail.php


OK çà roule, merci =D>

// les 4 variables sont remplies, on génère puis envoie le mail
$headers = 'From:'.$nom.' '.$prenom.' '.$telephone.' <'.$email.'>' . "\r\n";

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