Envoyer un mail PHP au format texte sans erreurs d’encodage …
Je trouve toujours géniaux les tutoriaux qui commencent pas « envoyer un mail au format texte avec la fonction mail() de PHP, c’est super simple… » (sous entendu : « en HTML par contre, pfoulala, ça c’est super dur :p « )
Personnellement j’ai toujours trouvé cela assez pénible : selon le logiciel de courrier du client, on a des erreurs d’encodage avec des signes cabalistiques partout dans 50% des cas ! Testez sur un iPhone, vous verrez …
Voilà ce que je fais pour éviter les erreurs, c’est pas sorcier mais au moins cela marche !
1. Récupérer les données à envoyer au bon format
D’abord la page où se trouve le formulaire de saisie, ou les données extraites de la base des données à envoyer, doivent être encodées en UTF-8 :
En-tête de la page du formulaire :
<head>
...
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
...
</head>
(pour les données extraites des bases voir le billet Web Tolosa sur ce sujet ici)
2. Préciser le type d’encodage utilisé dans l’en-têtes du mail : UTF-8
pourquoi UTF8 ? parce que les clients mails de pas mal de smartphones (Blackberry, iPhones, etc.) sont encodés en UTF8 et que de plus en plus de français les utilisent…
Donc le mail à envoyer sera formaté ainsi (on va prendre le cas de données récupérées depuis un formulaire en POST mais c’est pareil pour des données extraites d’une base des données):
$headers ='From: '.$_POST['mail']." "; // ici l'expediteur du mail
$headers .='Reply-To: '.$_POST['mail']." "; // ici l'adresse de réponse (facultatif)
$headers .='Content-Type: text/plain; charset="utf-8"'." "; // ici on envoie le mail au format texte encodé en UTF-8
$headers .='Content-Transfer-Encoding: 8bit'; // ici on précise qu'il y a des caractères accentués
3. Mettre en forme le message
La suite est plus classique. Par exemple pour la mise en forme possible des données d’un formulaire :
$message = " ";
$message .= "Message de ".$_POST['prenom']." ".$_POST['Nom']." ";
$message .= "Adresse : ".$_POST['Adresse']." - ".$_POST['Code-Postal']." - ".$_POST['Ville']." ";
$message .= "Tel : ".$_POST['Tel']." ";
$message .= "E-mail : ".$_POST['mail']." ";
$message .= "Texte du message : ";
$message .= "======== ";
$message .= $_POST['Message']." ";
$message .= "======== ";
$message .= "Envoi le ".date("d/m/Y - H:i");
4. Envoyer avec la fonction mail()…
Il n’y a plus qu’à l’envoyer tel quel avec la fonction mail() la plus simple :
if(mail("destinataire@fai.com", "Le sujet : message depuis mon formulaire", $message, $headers)) {
header("location: formulaire.php?error=0");
exit;
}
else {
header("location: formulaire.php?error=1");
exit;
}
Bala… en principe ça marche partout !



testé et approuvé. Thx man
exact.
on peut aussi rajouter un utf8_decode($var) si on extrait/insere des variables d’une base des données encodée en UTF-8 directement dans le corps du mail, sinon on a des caractères spéciaux non reconnus par les iphones par exemple
Super ce tuto, c’est ce que je cherchais… Néanmoins je débute en php et quelques points m’échappent. Serait-il possible d’avoir un exemple concret ?
Merci
Ca marche nickel, merci…Je me débattais depuis 1 siècle avec les caractères accentués !
Claude
Merci pour l’astuce. Tu me sauves la vie