Encodage des mails avec PHP [Résolu]

heliconius 344 Messages postés mardi 1 juillet 2008Date d'inscription 3 décembre 2017 Dernière intervention - 24 nov. 2017 à 00:00 - Dernière réponse : jordane45 19184 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 8 décembre 2017 Dernière intervention
- 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.




Afficher la suite 
344Messages postés mardi 1 juillet 2008Date d'inscription 3 décembre 2017 Dernière intervention

8 réponses

Répondre au sujet
jordane45 19184 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 8 décembre 2017 Dernière intervention - Modifié par jordane45 le 24/11/2017 à 08:01
+1
Utile
1
Bonjour

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


Cordialement, 
Jordane                                                                 
jordane45 19184 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 8 décembre 2017 Dernière intervention - 24 nov. 2017 à 08:31
Je t'invite également à regarder ceci :
http://www.commentcamarche.net/faq/47069-html-php-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.
Commenter la réponse de jordane45
legameur6810 30 Messages postés mardi 21 novembre 2017Date d'inscription 2 décembre 2017 Dernière intervention - 25 nov. 2017 à 16:55
0
Utile
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/
Commenter la réponse de legameur6810
heliconius 344 Messages postés mardi 1 juillet 2008Date d'inscription 3 décembre 2017 Dernière intervention - 25 nov. 2017 à 18:01
0
Utile
2
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.
legameur6810 30 Messages postés mardi 21 novembre 2017Date d'inscription 2 décembre 2017 Dernière intervention - 25 nov. 2017 à 18:15
Salut j'ai un ordinateur utilisant Mac OS.
heliconius 344 Messages postés mardi 1 juillet 2008Date d'inscription 3 décembre 2017 Dernière intervention > legameur6810 30 Messages postés mardi 21 novembre 2017Date d'inscription 2 décembre 2017 Dernière intervention - 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
Commenter la réponse de heliconius
heliconius 344 Messages postés mardi 1 juillet 2008Date d'inscription 3 décembre 2017 Dernière intervention - 28 nov. 2017 à 23:34
0
Utile
1
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 !
jordane45 19184 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 8 décembre 2017 Dernière intervention - 28 nov. 2017 à 23:34
bonne soirée.
Commenter la réponse de heliconius