La RFC 2822, qui standardise le format des courriers électroniques, impose un encodage particulier pour les entêtes de message. Un, en particulier, va retenir notre attention ici : le sujet. Correctement encoder ce dernier vous permettra d'augmenter le taux de remise et, donc, de lecture de vos messages applicatifs (confirmations, notifications, newsletter, etc.).
Ce que dit la RFC 2822
Un nom de champ DOIT être composé de caractères imprimables US-ASCII (ayant un code ASCI entre 22 et 126 compris), ou du caractère "virgule". La valeur d'un champ peut être composée de n'importe-quel caractère du jeu US-ASCII, et de CR ou LF.
Cependant, dans notre alphabet, ce champ "sujet" doit pouvoir contenir des caractères accentués, qui ne sont PAS compris dans le jeu US-ASCII. Il est alors essentiel de correctement l'encoder pour ne pas risquer de voir le courriel rabaisser au rang de SPAM par certains serveurs de mail équipés de filtres anti-spam (comme Amavis par exemple) pour non respect de la RFC.
Cas pratique
Imaginons que l'entête sujet de votre message soit le suivant :
Subject : Ce sujet est mal encodé !
Le serveur d'envoi peut détecter le problème d'encodage et mettre le courriel en quarantaine. Au final, le message sera peut être remis, mais le délai de transmission s'en voit ralongé (d'un poil, certes, mais sur un gros volume ceci consomme des cycles processeur sur le serveur d'envoi !). Le message sera alors remis avec un champ d'entête supplémentaire :
X-Quarantine-ID: <fb2QBXfjQ4Nx>
Un fichier de quarantaine Amavis relatif à cette erreur contiendrait :
Delivered-To: bad-header-quarantine X-Amavis-Alert: BAD HEADER SECTION Non-encoded 8-bit data (char C3 hex): Subject: Ce sujet est mal encod\303\251[...]
Le serveur de réception, ou le client de lecture final, peut également détecter ce problème d'encodage, ou prendre ce champ en considération et marquer le message comme courrier indésirable. Rassurez-vous, il y a bien sûr...
La solution
Elle est universelle, quelque soit le jeu de caractère utilisé pour le message ! En PHP, il suffit simplement d'encoder le sujet du message à l'aide de la fonction mb_encode_mimeheader.
$subject = mb_encode_mimeheader( $subject );
Cette fonction encode la valeur passée au format MIME, ici en ISO-8859, dans le plus pur respect de la RFC :
Subject: =?iso-8859-1?Q?Sujet_mal_encod=E9_!?=