Fonction mail() : envoyer un sujet avec des accents

Dans le cadre d'une application web, on peut être amené à envoyer des mails de notification simples et dans ce cas l'utilisation de la fonction mail() de PHP peut tout à fait suffir. Mais que faire dans le cas où le sujet doit comporter des accents sachant que la fonction utilise - si je ne me trompe pas - un charset anglon-saxon par défault.

En cherchant sur Internet, comme toujours, j'ai trouvé une solution simple qui m'a satisfaite, je vous la livre telle quelle :

// Message
$recipient = 'you@example.com';
$subject = '=?UTF-8?B?'.base64_encode('Sujet : éèàïî').'?=';
$sender = '"=?UTF-8?B?'.base64_encode('Nom : éèàïî').'?=" <me@example.com>';
$body = 'Corps du message avec des accents aussi : éèàïî';

// Entêtes du message
$headers = array();
$headers[] = 'From: '.$sender;
$headers[] = 'Content-Type: text/plain; charset=UTF-8; format=flowed;';
$headers[] = 'MIME-Version: 1.0';
$headers[] = 'Content-Transfer-Encoding: 8bit';
$headers = join("\n", $headers);

// Envoi du mail
mail($recipient, $subject, $body, $headers);

Ce code utilise l'UTF-8, c'est l'encodage par défaut de tout mon code en général que ca soit pour les fichiers, la base de données ou le "Content-Type" envoyé au navigateur. L'UTF-8 permet de faire des applications qui acceptent et utilisent n'importe quel caractère de n'importe quelle langue et sera en plus l'encodage par défaut pour le PHP6 à venir ce qui est une bonne chose.

Bien sûr, il faut mettre dans dans une fonction pour une meilleure factorisation, si je laisse ce code tel quel, c'est pour mieux en comprendre le mécanisme. Une visite de la documentation de la fonction mail() et des commentaires associés apportent de meilleures solutions. On y voit par exemple l'utilisation d'un code tel que celui-ci :

$subject= mb_encode_mimeheader($subject,"UTF-8", "B", "\n");

Je n'ai pas poussé mes investigations plus loin à ce niveau mais la lecture de la documentation de la fonction mb_encode_mimeheader() ne pourrait être que bénéfique.

Bon, après si votre application doit faire beaucoup d'envoi de mail (notification mais aussi newsletter, pourquoi pas), il vaut mieux passer par une classe spécifique qui gèrera tous les aspects technique comme celui que nous venons de voir de manière transparente. Je vous conseille l'utilisation de la classe HTML Mime Mail de phpguru.org mais il en existe d'autres comme PEAR::Mail ou PHP Mailer.

Posté le vendredi 08 février 2008 dans .

Commentaires

Ajouter un commentaire

Il n'est plus possible de réagir à cette entrée directement mais si vous pensez que votre intervention peut être intéressante, envoyez-moi votre commentaire, je l'ajouterai ici en votre nom.