Encodage des mails avec PHP
Résolu
heliconius
Messages postés
539
Date d'inscription
Statut
Membre
Dernière intervention
-
jordane45 Messages postés 38486 Date d'inscription Statut Modérateur Dernière intervention -
jordane45 Messages postés 38486 Date d'inscription Statut Modérateur Dernière intervention -
Bonsoir,
Je rencontre une difficulté dans la réalisation d'un script PHP expédiant un mail.
La fonction PHP est
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 :
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 :
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.
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:
- Encodage des mails avec PHP
- Easy php - Télécharger - Divers Web & Internet
- Expert php pinterest - Télécharger - Langages
- Comment sauvegarder des mails - Guide
- Gmail supprimer tous les mails d'un expéditeur - Guide
- Mail avec accusé de réception gmail - Guide
4 réponses
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 :
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.
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.
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 !
Merci Jordane !
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/
https://www.scriptol.fr/creation-site-web/accents-html.php
et voici mon site web : https://html-javascript-css-php.000webhostapp.com/
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.