envoi de mail texte + HTML : quel codage choisir ?

Olivier Duffez (admin)
Membre du personnel
Comme le savent certains d'entre vous, ma newsletter n'est pas visible dans certains logiciels de messagerie (c'est le cas notamment d'Hotmail).
Le problème vient sûrement du codage que j'utilise. Voilà une partie de mon code de génération du mail (texte + HTML) :
Code:
      // html section 
      $Msg.="\n--".$IB."\n";
      $Msg.="Content-Type: text/html;\n\tcharset=\"iso-8859-1\"\n";
      $Msg.="Content-Transfer-Encoding: base64\n\n";
      // html goes here 
      $Msg.=chunk_split(base64_encode($Html))."\n\n";
Est-ce que l'un d'entre vous pourrait me dire ce qu'il faut utiliser pour envoyer un mail HTML lisible par tout le monde ? Merci d'avance.

Olivier
 
WRInaute accro
Bonjour,
ceci
Code:
/* Pour envoyer un mail au format HTML, vous pouvez configurer le type Content-type. */
$headers  = "MIME-Version: 1.0\r\n";
$headers .= "Content-type: text/html; charset=iso-8859-1\r\n";

/* et hop, à la poste */
mail($to, $subject, $message, $headers);
?>
 
Olivier Duffez (admin)
Membre du personnel
j'avais essayé mais ça ne marchait pas dans tous les cas (évidemment je n'avais pas noté lesquels). Je crois que je vais y revenir et je verrai bien ce que ça donne !
 
WRInaute impliqué
Si vous permettez que je "squatte" juste un peu ce topic : j'envoie des mails en texte, est-ce quand même nécessaire de préciser le charset dans les headers (sachant que mon fichier script qui envoie le mail est lui-même encodé en iso-8859-1) ?
 
Olivier Duffez (admin)
Membre du personnel
WRInaute occasionnel
Pourquoi ne pas passer directement à l'UTF-8? Il est universel et j'ai deja reçu des mails en japonnais sous hotmail, les caractères accentués francais ne doivent donc pas être un problème...
 
WRInaute occasionnel
Bobez a dit:
Si vous permettez que je "squatte" juste un peu ce topic : j'envoie des mails en texte, est-ce quand même nécessaire de préciser le charset dans les headers (sachant que mon fichier script qui envoie le mail est lui-même encodé en iso-8859-1) ?
Le paramètre accept-charset de la balise form prime sur l'encodage du script et de la page...
 
Olivier Duffez (admin)
Membre du personnel
maxttb a dit:
Pourquoi ne pas passer directement à l'UTF-8? Il est universel et j'ai deja reçu des mails en japonnais sous hotmail, les caractères accentués francais ne doivent donc pas être un problème...
aurais-tu qq lignes de code d'exemple ?
 
WRInaute impliqué
maxttb a dit:
Le paramètre accept-charset de la balise form prime sur l'encodage du script et de la page...
Donc, si je te suis bien, il vaut mieux que je rajoute le charset dans les headers ?

Code:
$headers .= "charset=iso-8859-1\r\n";
 
WRInaute occasionnel
WebRankInfo a dit:
aurais-tu qq lignes de code d'exemple ?
Code:
$Msg.="Content-Type: text/html; charset=utf-8\n";
Et le tour est joué.
Du moins, c'est ce que je fais dans un script Perl pour envoyer des mails. Attention cependant, il faut renseigner la balise FORM avec le paramètre accept-charset :
Code:
<form action="script.php" method="post" accept-charset="utf-8">
 
WRInaute occasionnel
Bobez a dit:
maxttb a dit:
Le paramètre accept-charset de la balise form prime sur l'encodage du script et de la page...
Donc, si je te suis bien, il vaut mieux que je rajoute le charset dans les headers ?

Code:
$headers .= "charset=iso-8859-1\r\n";
il faut impérativement que les charsets lors de ton envoi de mail et de ton formulaire soient identiques, à moins bien sûr de faire la conversion dans le script...
Dans ton cas, le fait que ton email soit en mode texte ne change rien à l'encodage lui même... En effet, le mode texte ou HTML ne sert qu'aux logiciels clients lors du rendu du message. Qu'il soit texte ou HTML, si le jeu de caractères n'est pas le bon, il ne sera pas affiché correctement. Tu peux très bien encoder un message texte en UTF-8 ou un message HTML en iso-8859-1.
Une petite ligne dans l'header permet, à coup sûr (à moins bien entendu que le jeu de caractère ne soit pas installé) d'avoir un rendu correct. Pourquoi ne pas le mettre?
 
WRInaute impliqué
maxttb a dit:
Une petite ligne dans l'header permet, à coup sûr (à moins bien entendu que le jeu de caractère ne soit pas installé) d'avoir un rendu correct. Pourquoi ne pas le mettre?
En effet ! Par contre j'ai essayé de l'ajouter, mais ça foire ! Comment faut-il le goupiller avec le header "From" ? Car ce que je fais ne fonctionne pas, il assimile le charset à une annonce du champ from...
Merci
 
WRInaute occasionnel
Bobez a dit:
En effet ! Par contre j'ai essayé de l'ajouter, mais ça foire ! Comment faut-il le goupiller avec le header "From" ? Car ce que je fais ne fonctionne pas, il assimile le charset à une annonce du champ from...
Merci
Ajoute ceci à ton header, juste avant le message :
Code:
$Msg.="Content-Type: text/plain; charset=charset=iso-8859-1\n";
Je ne suis pas certain que mettre un \r serve à quelque chose, à moins bien sûr que ton serveur soit sous Windows.
 
WRInaute impliqué
Salut,

Cela ne fonctionne tjs pas, je ne saisis pas bien s'il faut mettre ça dans les headers où dans le corps du message ? Voici mon code actuel :

Code:
$sujet = 'Sujet du message';
$corps = 'bla bla bla bla';
$headers = 'From: Bobez <bobez@domaine.com>';
mail($email, $sujet, $corps, $headers);
 
WRInaute occasionnel
Au temps pour moi, il faut le rajouter dans les headers...
Code:
$headers.="Content-Type: text/plain; charset=charset=iso-8859-1\n";
J'ai confondu ton source avec celui de WebRankInfo
 
WRInaute impliqué
Merci pour la précision, mais cela ne fonctionne toujours pas ! Le champ "From" du mail reçu est le suivant :

Code:
From: "Bobez <bobez@domaine.com>Content-Type": text/plain@60gp.ovh.net;, charset=charset=iso-8859-1n@60gp.ovh.net
 
WRInaute impliqué
Mea culpa, problème résolu. Visiblement il n'appréciait pas que je mette

Code:
$headers .= 'Content-Type: text/plain; charset=iso-8859-1\n';
au lieu de
$headers .= "Content-Type: text/plain; charset=iso-8859-1\n";

Merci pour ton aide, maxttb :)
 
Discussions similaires
Haut