Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Pb de charset dans envoi de mail en PHP

8 réponses
Avatar
SK Lurk
Bonjour,

J'ai un problème de charset avec l'envoi de mail multipart en PHP :

$TxtMsgTXT = "Bonjour";
$TxtMsgHTML = "<b>Bonjour aéöèçà</b>";
$Boundary = '-----='.md5(uniqid(rand(), TRUE));
$TxtMsg = '--'.$Boundary."\n";
$TxtMsg .= 'Content-Type: text/plain; charset="utf-8"'."\n";
$TxtMsg .= "Content-Transfert-Encoding: quoted-printable\n\n";
$TxtMsg .= $TxtMsgTXT;
$TxtMsg .= "\n\n";
$TxtMsg .= '--'.$Boundary."\n";
$TxtMsg .= 'Content-Type: text/html; charset="utf-8"'."\n";
$TxtMsg .= "Content-Transfert-Encoding: quoted-printable\n\n";
$TxtMsg .= $TxtMsgHTML;
$TxtMsg .= "\n\n";
$TxtMsg .= '--'.$Boundary."--\n";
$EnTeteMail.= "MIME-Version: 1.0\r\n";
$EnTeteMail.= 'Content-type: multipart/alternative;
boundary="'.$Boundary.'"; charset=utf-8'."\n";

Le code ci-dessus fonctionne.
Le problème c'est que je voudrait envoyer la partie TXT en iso-8859-1 en
laissant la partie HTML en UTF-8.
Si je remplace la ligne 5 par
$TxtMsg .= 'Content-Type: text/plain; charset="iso-8859-1"'."\n";
et bien je reçois la partie HTML illisible : elle est affiché comment de
l'utf8 vu en iso.
Comment faire ?

Merci de votre aide.

SKL

8 réponses

Avatar
Olivier Miakinen
Bonjour,

J'ai un problème de charset avec l'envoi de mail multipart en PHP :

$TxtMsgTXT = "Bonjour";
$TxtMsgHTML = "<b>Bonjour aéöèçà</b>";


Je suppose que ton fichier source est en UTF-8, auquel cas c'est correct.

$Boundary = '-----='.md5(uniqid(rand(), TRUE));


Ok.

$TxtMsg = '--'.$Boundary."n";
$TxtMsg .= 'Content-Type: text/plain; charset="utf-8"'."n";
$TxtMsg .= "Content-Transfert-Encoding: quoted-printablenn";
$TxtMsg .= $TxtMsgTXT;
$TxtMsg .= "nn";


Ok, encore que pour le texte « Bonjour » tu pourrais aussi bien déclarer
us-ascii en 7bit.

$TxtMsg .= '--'.$Boundary."n";
$TxtMsg .= 'Content-Type: text/html; charset="utf-8"'."n";
$TxtMsg .= "Content-Transfert-Encoding: quoted-printablenn";
$TxtMsg .= $TxtMsgHTML;
$TxtMsg .= "nn";


Là, déjà, c'est incorrect : les caractères « éöèçà » en utf-8 ne sont
pas valides en quoted-printable. Essaye de mettre 8bit à la place, ça
devrait aller mieux (et fais pareil pour la partie texte quand tu auras
autre chose que de l'us-ascii).

$TxtMsg .= '--'.$Boundary."--n";
$EnTeteMail.= "MIME-Version: 1.0rn";


Tiens ? Pourquoi un r d'un seul coup ? J'espère pour toi que la
fonction d'envoi de courriel que tu utilises remplace déjà n par rn.
Si c'est bien le cas, tu n'as pas besoin de r ici. Si au contraire ce
n'est pas le cas, il en faut partout.

$EnTeteMail.= 'Content-type: multipart/alternative;
boundary="'.$Boundary.'"; charset=utf-8'."n";


Beuh... on peut préciser un charset pour un contenu multipart ? Je n'en
sais rien, je pose la question. En tout cas je ne pense pas que cela
serve à quoi que ce soit.

Le code ci-dessus fonctionne.


Par chance, je dirais... ;-)

Le problème c'est que je voudrait envoyer la partie TXT en iso-8859-1 en
laissant la partie HTML en UTF-8.
Si je remplace la ligne 5 par
$TxtMsg .= 'Content-Type: text/plain; charset="iso-8859-1"'."n";
et bien je reçois la partie HTML illisible : elle est affiché comment de
[ comme ] ?

l'utf8 vu en iso.


Ça me semble bizarre, mais vu qu'il y a un certain nombre d'erreurs
même dans la version « qui marche », peut-être qu'en les corrigeant tu
résoudras ton problème.

--
Olivier Miakinen
Non, monsieur le juge, je vous le jure : jamais je n'ai cité
Bruxelles dans ma signature.

Avatar
SK Lurk
Ça me semble bizarre, mais vu qu'il y a un certain nombre d'erreurs
même dans la version « qui marche », peut-être qu'en les corrigeant tu
résoudras ton problème.


Merci pour la réponse.
J'ai modifié le programme pour obtenir ça :

$Boundary = '-----='.md5(uniqid(rand(), TRUE));
$TxtMsg = '--'.$Boundary."rn";

$TxtMsg .= 'Content-Type: text/plain; charset="iso-8859-1"'."rn";
$TxtMsg .= "Content-Transfert-Encoding: 8bitrnrn";
$TxtMsg .= $TxtMsgTXT;
$TxtMsg .= "rnrn";

$TxtMsg .= '--'.$Boundary."rn";
$TxtMsg .= 'Content-Type: text/html; charset="utf-8"'."rn";
$TxtMsg .= "Content-Transfert-Encoding: 8bitrnrn";
$TxtMsg .= $TxtMsgHTML;
$TxtMsg .= "rnrn";
$TxtMsg .= '--'.$Boundary."--rn";

$EnTeteMail.= "MIME-Version: 1.0rn";
$EnTeteMail.= 'Content-type: multipart/alternative;
boundary="'.$Boundary.'";'."rn";


Résultat : pareil qu'avant.
Je reçois le TXT bien, mais pas le HTML.
Si je spécifie "iso-8859-1" pour la partie TXT la partie HTML s'affiche mal
(comme un texte utf-8 dans un éditeur qui ne sait pas l'afficher).
Mais si je marque "utf-8" pour la partie TXT, alors tout va bien.
Etrange.

Avatar
Olivier Miakinen
Ça me semble bizarre, mais vu qu'il y a un certain nombre d'erreurs
même dans la version « qui marche », peut-être qu'en les corrigeant tu
résoudras ton problème.


Merci pour la réponse.
J'ai modifié le programme pour obtenir ça :

$Boundary = '-----='.md5(uniqid(rand(), TRUE));
$TxtMsg = '--'.$Boundary."rn";


Tiens ? J'aurais imaginé que la solution passerait plutôt par la
suppression des r. Mais bon, il est possible que la fonction d'envoi
se débrouille dans tous les cas.

[...]

Résultat : pareil qu'avant.
Je reçois le TXT bien, mais pas le HTML.
Si je spécifie "iso-8859-1" pour la partie TXT la partie HTML s'affiche mal
(comme un texte utf-8 dans un éditeur qui ne sait pas l'afficher).
Mais si je marque "utf-8" pour la partie TXT, alors tout va bien.
Etrange.


Envoie-moi donc les deux versions par courriel, je regarderai si cela
m'inspire plus que le code seul. À tout hasard, commence par un message
en texte seul pour me prévenir que tu fais l'essai, parce que sinon je
risque de jeter le multipart avec les spams du jour.

[ suivi positionné ]

Cordialement,
--
Olivier Miakinen


Avatar
P'tit Marcel
SK Lurk wrote:
$EnTeteMail.= "MIME-Version: 1.0rn";
$EnTeteMail.= 'Content-type: multipart/alternative;
boundary="'.$Boundary.'";'."rn";


Je ne crois pas qu'il faille un ; à cet endroit.


Résultat : pareil qu'avant.
Je reçois le TXT bien, mais pas le HTML.
Si je spécifie "iso-8859-1" pour la partie TXT la partie HTML s'affiche mal
(comme un texte utf-8 dans un éditeur qui ne sait pas l'afficher).
Mais si je marque "utf-8" pour la partie TXT, alors tout va bien.


Est-ce que tu as testé sur plusieurs clients de messagerie (Outlook /
Outlook Express / Mozilla / Netscape / etc. ) ?

eça
--
P'tit Marcel

Avatar
SK Lurk
Est-ce que tu as testé sur plusieurs clients de messagerie (Outlook /
Outlook Express / Mozilla / Netscape / etc. ) ?


Effectivement j'aurais pu tester d'autres clients. Mais pour correspondre au
marché, si ça ne doit fonctionner qu'avec un seul client, ce doit être
Outlook !

Avatar
ftc
Est-ce que tu as testé sur plusieurs clients de messagerie (Outlook /
Outlook Express / Mozilla / Netscape / etc. ) ?



Effectivement j'aurais pu tester d'autres clients. Mais pour correspondre au
marché, si ça ne doit fonctionner qu'avec un seul client, ce doit être
Outlook !


Le marché des clients de messagerie est quand même beaucoup plus
disparate que celui des navigateurs web. Il suffit de regarder les
en-têtes des messages sur ce newsgroup pour se rendre compte qu'Outlook
est très loin d'avoir une position dominante.

Sous Thunderbird, j'ai une extension qui m'affiche directement le client
de messagerie et je ne vois pas passer très souvent Outlook.
Actuellement, je dirais que le grand gagnant est IMP ( vive le webmail )
suivi par Thunderbird et Outlook Express.


Avatar
SK Lurk
Sous Thunderbird, j'ai une extension qui m'affiche directement le client
de messagerie et je ne vois pas passer très souvent Outlook.
Actuellement, je dirais que le grand gagnant est IMP ( vive le webmail )
suivi par Thunderbird et Outlook Express.


Effectivement. Mais les adresses auxquelles je souhaite envoyer ce mail sont
à 90% des adresses preofessionnelles. Je ne pense pas que beaucoup
d'entreprises (excepté les TPE) utilise le webmail pour leurs employés.
De même pour les configurations. Le parc mondial est peut-être composé à 90%
de PC, mais ma cible est à 45% en Macintosh.
J'ai donc vérifié que la configuration type de mes destinataires est un Mac
(ou Windows) avec Outlook Express.

Avatar
ftc
Sous Thunderbird, j'ai une extension qui m'affiche directement le client
de messagerie et je ne vois pas passer très souvent Outlook.
Actuellement, je dirais que le grand gagnant est IMP ( vive le webmail )
suivi par Thunderbird et Outlook Express.



Effectivement. Mais les adresses auxquelles je souhaite envoyer ce mail sont
à 90% des adresses preofessionnelles.


Les stats que je vous donnent sont réalisées avec 70% de mails pro.


Je ne pense pas que beaucoup
d'entreprises (excepté les TPE) utilise le webmail pour leurs employés.


Si, il y en a pas mal et de plus en plus il me semble et ce parmi les
TPE, mais aussi les PME ( je ne connais pas bien l'environnement grandes
entreprises ).
Ca fait souvent partie du package *Groupware* lorsque les entreprises ne
veulent pas investir dans Exchange. De plus en plus de Groupware ont une
interface web et il devient donc naturel d'utiliser aussi le webmail.
Beaucoup de gens ont pris l'habitude d'utiliser le webmail pour leurs
adresses personnelles ( laposte, hotmail, leur FAI ...), la transition
vers un webmail au niveau pro est donc relativement facile.
Le webmail fait aussi partie intégrante de la plupart des solution de CRM.