picture
mars 26, 2010 PHP 5 Commentaires

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 ! ;)

5 Responses to “Envoyer un mail PHP au format texte sans erreurs d’encodage …”

5 Commentaires

  1. yoman dit :

    testé et approuvé. Thx man

  2. john dit :

    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

  3. luan dit :

    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

  4. Cla94800 dit :

    Ca marche nickel, merci…Je me débattais depuis 1 siècle avec les caractères accentués ! :mrgreen:

    Claude

  5. Bruno Soufo dit :

    Merci pour l’astuce. Tu me sauves la vie

Commentaire

Name

Mail (ne sera pas publié)

Website

Laisser ces deux champs tels quels :
:D :-) :( :o 8O :? 8) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: