PHP mail sujet correctement encodé
Par PlaceOweb le vendredi, novembre 5 2010, 11:45 - PHP - Lien permanent
Comment éviter d'avoir des caractères spéciaux illisibles dans le sujet lors de l'envoi de mail avec php ?
La commande mail( string $to , string $subject , string $message [, string $additional_headers [, string $additional_parameters ]] )
Pour le sujet il est précisé de suivre l'encodage tel que le spécifie la RFC 2047.
Encodings Initially, the legal values for "encoding" are "Q" and "B". These encodings are described below. The "Q" encoding is recommended for use when most of the characters to be encoded are in the ASCII character set; otherwise, the "B" encoding should be used. Nevertheless, a mail reader which claims to recognize 'encoded-word's MUST be able to accept either encoding for any character set which it supports. The "B" encoding automatically meets these requirements. The "Q" encoding allows a wide range of printable characters to be used in non-critical locations in the message header (e.g., Subject), with fewer characters available for use in other locations.
- mb_internal_encoding — Lit/modifie l'encodage interne
- mb_encode_mimeheader — Encode une chaîne pour un en-tête MIME
//die(mb_internal_encoding()); // ISO-8859-1 /* Utilise l'encodage interne UTF-8 */ mb_internal_encoding("UTF-8"); /* Affiche l'encodage interne courant */ //die(mb_internal_encoding()); // UTF-8
Par défaut, dépends de la conf de php.ini :
[iconv] ;iconv.input_encoding = ISO-8859-1 ;iconv.internal_encoding = ISO-8859-1 ;iconv.output_encoding = ISO-8859-1
L'envoi de votre mail :
$subject = "Mon sujet avec des caractères bien français :) ho yé ho yé !"; $subject = mb_encode_mimeheader($subject,"UTF-8", "B", "\n"); $message = "Mon blabla UTF-8 tout comme mon fichier php source écrit en UTF 8 français." $additional_headers = 'Content-type: text/plain; charset=UTF-8' . "\r\n"; mail("votre.mail@votre.domaine", $subject, $message, $additional_headers);
Ainsi le si vous regardez le source du mail :
Le sujet : "données différentes"
qui était envoyé comme suit :
Subject: Alerte : données différentes : 220583 / 205295
deviendra :
Subject: Alerte : =?UTF-8?B?ZG9ubsOpZXMgZGlmZsOpcmVudGVzIDogMjIwNjEz?= =?UTF-8?B?IC8gMjA1NjY4?=
Et votre sujet sera correctement lu par les différents clients de messagerie, Outllook, Gmail, Zimbra, etc...