Encodage des mails avec PHP

Résolu/Fermé
heliconius Messages postés 545 Date d'inscription mardi 1 juillet 2008 Statut Membre Dernière intervention 23 juin 2023 - 24 nov. 2017 à 00:00
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 - 28 nov. 2017 à 23:34
Bonsoir,

Je rencontre une difficulté dans la réalisation d'un script PHP expédiant un mail.
La fonction PHP est
mail($to, $subject, $message, $headers);


Le destinataire reçoit le mail avec des caractères qu'il dénomme "cabalistiques" et qui, je crois, sont dûs à l'encodage ANSI/UTF-8.

J'ai créé les scripts de test ci-dessous avec un message bidon pourvu qu'il contienne cédilles, caractères accentués et d'autres tels que €. Le script a été réalisé sous Windows avec un éditeur codé ANSI. Puis il a été téléchargé par FTP sur un serveur Linux (UTF-8).

Premier script :
<?php
$to      = "pierre@mydomain.fr";
$subject = "Test codage";
$msg     = "Sans façon, à 20,00 € c'était pas cher.\n"; // accents, cédille, etc.

// UTF-8
$headers  = "From: Tests <codage@mydomain.fr>\r\n";
$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-Type: text/plain; charset=\"UTF-8\"\r\n";
$headers .= "Content-Transfer-Encoding: 8bit\r\n";
$headers .= "To: Pierre <pierre@mydomain.fr>\r\n\r\n";

mail($to, "$subject UTF-8", utf8_encode($msg), $headers);

// ISO-8859-1
$headers  = "From: Tests <codage@mydomain.fr>\r\n";
$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-Type: text/plain; charset=\"ISO-8859-1\"\r\n";
$headers .= "Content-Transfer-Encoding: 8bit\r\n";
$headers .= "To: pierre@mydomain.fr\r\n\r\n";

mail($to, "$subject ISO-8859-1", $msg, $headers);
?>

Résultats sur un client mail configuré pour ANSI (UTF-8 puis ANSI) :
1: UTF-8 :


2: ANSI :


Résultats sur un navigateur web sur le serveur de l'opérateur (UTF-8 puis ANSI) :
1: UTF-8 :


2: ANSI :


J'ai écrit ensuite un autre script qui envoie des mails contenant deux versions du même message : une encodée ANSI, l'autre encodée UTF-8, chacune de ces versions étant avec le 'Content-Type' adapté (la ligne 'boundary' représentant la frontière entre ces deux versions) afin que le client de messagerie n'affiche que la version du message correspondant à son encodage. Rien ne se passe et je vois les deux versions dans le corps du message.

Voici le script :
<?php
$to       = "pierre@mydomain.fr";
$subject  = "Test codage";
$msg      = "Sans façon, à 20,00 € c'était pas cher."; // accents, cédille, etc.

$boundary = md5(date("d/m/Y H:i:s"));

// UTF-8 + ISO-8859-1
$headers  = "MIME-Version: 1.0\n";
$headers .= "Content-Type: multipart/mixed; boundary=\"$boundary\"\n";
$headers  = "From: Tests <codage@mydomain.fr>\n";
$headers .= "To: Pierre <pierre@mydomain.fr>\n";

// UTF-8
$body  = "--$boundary\n";
$body .= "Content-Type: text/plain; charset=\"UTF-8\"\n";
$body .= "Content-Transfer-Encoding: 8bit\n";
$body .= utf8_encode($msg)."\n";

// ANSI
$body .= "--$boundary\n";
$body .= "Content-Type: text/plain; charset=\"ISO-8859-1\"\n";
$body .= "Content-Transfer-Encoding: 8bit\n";
$body .= "$msg\n";

$body .= "--$boundary--\n";

mail($to, "$subject UTF-8 et ISO-8859-1", $body, $headers);
?>

Ci-dessous le résultat avec un client de messagerie ANSI et web (UTF-8) :

1: ANSI :


2: UTF-8 :


Mes questions :

1) où se situe l'erreur ?
2) comment envoyer dans un message les deux versions afin que le client utilisé n'affiche que celle correspondant à son encodage pour lequel il a été configuré ?
3) ne vaut-il pas mieux spécifier que le texte du message est encodé ANSI et qu'il doit être affiché de la sorte (qui peut le plus peut le moins) plutôt que de vouloir mettre les deux encodages ? Mon objectif étant que le message soit lisible sans caracères "cabalistiques" et ce, quelque soit le client de messagerie ?
4) Dans les deux cas, le caractère euros n'est pas affiché. Comment y remédier ?

Merci infiniment pour votre aide ou vos conseils.




A voir également:

4 réponses

jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
Modifié le 24 nov. 2017 à 08:01
Bonjour

Tu sembles avoir oublié des points devant les = des headers


Cordialement, 
Jordane                                                                 
1
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
24 nov. 2017 à 08:31
Je t'invite également à regarder ceci :
https://forums.commentcamarche.net/forum/affich-37584944-php-html-caracteres-accentues-et-l-utf8

Sachant qu'à ma connaissance tu ne peux pas envoyer avec deux encodages dans le même mail.

De plus, les fonctions utf8 encode et decode ne sont pas utiles si les données sont correctement formatées au départ.
0
heliconius Messages postés 545 Date d'inscription mardi 1 juillet 2008 Statut Membre Dernière intervention 23 juin 2023 137
25 nov. 2017 à 18:01
Ah, Merci Jordane !

J'aurais dû m'en doûter. Cette erreur de débutant : s'obstiner à chercher l'erreur ! Relire 100 fois le code, passer 100 fois sur la même erreur et ne pas la voir. J'essaye pourtant d'écrire mon code avec rigeur (les signes = bien alignés) pour que les erreurs sautent aux yeux, mais bon... J'aurais dû faire comme d'habitude : faire un break pendant une heure, aller boire une café et revenir lire le code à tête reposée pour que cette erreur du point de concaténation oublié saute aux yeux. Car c'était ça l'erreur.

Tu as raison : les deux versions (ANSI et UTF-8) dans le même message ne fonctionnent pas. L'idée m'était venue en voyant des messages "multipart/mixed" avec texte et HTML ou avec texte et PJ (codée en base64), les contenus différents étant séparés par un "boundary".

Le problème a été réglé de la façon suivante :
<?php
$chars   = "Windows-1252";
$to      = "pierre@mydomain.fr";
$subject = "Test codage";
$msg     = "Sans façon, à 20,00 € c'était pas cher."; // accents, cédille, etc.

$headers = "From: Tests <codage@mydomain.fr>\r\n"
         . "MIME-Version: 1.0\r\n"
         . "Content-Type: text/plain; charset=\"$chars\"\r\n"
         . "Content-Transfer-Encoding: 8bit\r\n";

$pied = "\n\n---\nhttp://www.mydomain.fr"; // signature du mail

mail($to, "$subject $chars", $msg.$pied, $headers);
?>


Pour l'instant ça va car c'est sur un site accessible à la famille et les messages sont destinés à des personnes que je connais. Ils utilisent tous Windows. Mais cette solution du charset="Windows 1252" donne un message parfaitement lisible sans altération aussi bien avec un client mail ANSI que UTF-8, ces clients étant sous Windows. Mais il faudra que je teste le résultat avec un client mail Linux et Mac OS X pour voir si le résultat est toujours correct. Je continuerai à chercher plus tard. Mais pour l'heure et ce que j'ai à faire, c'est réglé.

En tout cas merci, ça m'a débloqué le tout.

NB pour legameur6810: Merci. Mais je n'ai aucun problème avec les entités HTML quand je construis des pages HTML avec ou sans PHP. Là il s'agissait de mail, pas de page web. Mais merci quand même.
1
legameur6810 Messages postés 45 Date d'inscription mardi 21 novembre 2017 Statut Membre Dernière intervention 14 avril 2018
25 nov. 2017 à 18:15
Salut j'ai un ordinateur utilisant Mac OS.
0
heliconius Messages postés 545 Date d'inscription mardi 1 juillet 2008 Statut Membre Dernière intervention 23 juin 2023 137 > legameur6810 Messages postés 45 Date d'inscription mardi 21 novembre 2017 Statut Membre Dernière intervention 14 avril 2018
26 nov. 2017 à 01:00
Ok legameur6810. Peux-tu tester le dernier script avec $chars="Windows-1252"; et me dire si le message "Sans façon, à 20,00 € c'était pas cher." est lu correctement par un client mail Mac OS ? (accents, cédille et €). Merci beaucoup
0
heliconius Messages postés 545 Date d'inscription mardi 1 juillet 2008 Statut Membre Dernière intervention 23 juin 2023 137
28 nov. 2017 à 23:34
J'aurais bien aimé avoir le résultat sur un ordinateur client Mac OS. Mais j'attends toujours la réponse. Comme j'ai trouvé une solution qui, pour l'instant me satisfait, je considère le fil comme clos et résolu.
Merci Jordane !
1
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
28 nov. 2017 à 23:34
bonne soirée.
0
legameur6810 Messages postés 45 Date d'inscription mardi 21 novembre 2017 Statut Membre Dernière intervention 14 avril 2018
25 nov. 2017 à 16:55
Hey voici les caractère spéciaux en html ;)

https://www.scriptol.fr/creation-site-web/accents-html.php

et voici mon site web : https://html-javascript-css-php.000webhostapp.com/
0