Page 1 sur 1

Mail, encodage html

Posté : 25 mars 2010, 16:42
par Albat90
Bonjour,

J'ai un petit problème avec l'affichage des caractères dans un lien.

Je m'explique. J'envoie un mail pour la confirmation d'inscription avec un lien comme on peut le voir dans plusieurs sites.

Ce lien est au format HTML.

Voici mon entête :
$boundary = "-----=" . md5( uniqid ( rand() ) );
		$headers = "Reply-to: *****.com <webmaster@*****.com>\n";
		$headers .= "From: *****.com <anonymous@*****.com>\n";
		$headers .= "Cc: <webmaster@*****.com>\n";
		$headers .= "Bcc: webmaster@*****.com, webmaster@*****.com \n";
		$headers .= "MIME-Version: 1.0\n";
		$headers .= "Content-Type: multipart/alternative; boundary=\"$boundary\"";
	$message = "This is a multi-part message in MIME format.\n\n";
	$message .= "--" . $boundary . "\n";
	$message .= "Content-Type: text/html; charset=\"iso-8859-1\"\n";
	$message .= "Content-Transfer-Encoding: quoted-printable\n\n";
	$message .= $messtxt;
	$message .= "\n\n";
	$message .= "--" . $boundary . "--\n"; 
Le message est au format html et je n'ai aucun soucis avec la mise en page.
Cependant, j'ai un problème avec mon lien.
$lien = "<a href='http://www.*****.com/beta/?page=inscription3&key=$key&parametre=$para'>http://www.record-forever.com/beta/?page=inscription3&key=$key&parametre=$para</a>";
Je test l'email sur orange et hotmail.
Voici les liens affichés :
Orange :
http://www.****.com/beta/?page=inscription3&key=5&parametreKab6457407e44.83329098
Normalement, il devrait m'afficher :
http://www.****.com/beta/?page=inscription3&key=5&parametre=4bab6457407e44.83329098
Hotmail :
http://www.*****.com/beta/?page=scription3&key=parametreKab6457407e44.83329098
Comme vous pouvez le remarquer, il y a un problème à chaque fois qu'un "=" est inséré.
J'ai essayé en ajoutant deux * devant les variables pour voir le résultat.
Orange :
http://www.****.com/beta/?page=**inscription3&key=**5&parametre=**4bab6457407e44.83329098
Plus de soucis, résultat que je comprends en fonction de mon code.

Hotmail :
http://www.****.com/beta/?page=inscription3&key=5&parametre=4bab6457407e44.83329098
Résultat attendu initialement, il me mange les deux "*" après chaque "=". Voila pourquoi sur le premier code j'ai ?page=scription3 au lieu de ?page=inscription3 sous hotmail.

Bref, j'ai des résultats différents sur les boites mails. J'ai l'impression que ça vient de l'encodage html. J'ai essayé avec htmlspecialchar(), htmlentities() et html_entity_decode()... Aucun ne donne le résultat attendu. :(

Merci d'avance pour vos réponses :)

Albat90 ;)

Re: Mail, encodage html

Posté : 25 mars 2010, 17:33
par devlop78
Essaie (header)

$From .= "MIME-version: 1.0\n";
$From .= "Content-type: text/html; charset= iso-8859-1\n";

Tiens ... je viens de voir un truc ...

$lien = "<a href='http://www.*****.com/beta/?page=inscription3&key=$key&parametre=$para'>http://www.record-forever.com/beta/?page=inscription3&key=$key&parametre=$para</a>";

Tu ne serais pas en train d'insérer des caractères spéciaux dans ta page ??? urlencode sur $key et $para, et htmlentities sur L'ENSEMBLE des deux 'http://www.*****.com/beta/?page=inscription3&key=$key&parametre=$para'.

Dis nous ce que ça donne avec ce que je viens de te donner (et fais urlencode ET htmlenties)

Re: Mail, encodage html

Posté : 25 mars 2010, 19:11
par dunbar
Salut,

Et comme ceci ?
$lien = '<a href="http://www.*****.com/beta/?page=inscription3&key='.$key.'&parametre='.$para.'">http://www.record-forever.com/beta/?page=inscription3&key='.$key.'&parametre='.$para.'</a>';

Re: Mail, encodage html

Posté : 26 mars 2010, 01:20
par devlop78
le minimum serait de remplacer les & par des &

Essaie ce que j'ai dis, ça ne coûte rien, et si ça ne fonctionne pas, ça écartera cette hypothétique problème.

Re: Mail, encodage html

Posté : 26 mars 2010, 01:28
par Dr@ke
Ce n'est pas forcément une bonne idée, en générale on convertit ce genre de caractères seulement à l'affichage des données et encore plus pour les emails.
Car il arrive souvent que la boite mail convertisse elle même ces mêmes caractères, on a déjà eu ce genre de problèmes évoqués dans des Topic sur ce forum...

Re: Mail, encodage html

Posté : 26 mars 2010, 04:57
par devlop78
Orange :
http://www.****.com/beta/?page=inscription3&key=5&parametreKab6457407e44.83329098
Normalement, il devrait m'afficher :
http://www.****.com/beta/?page=inscription3&key=5&parametre=4bab6457407e44.83329098

A SAVOIR que le code hexadecimal ASCII de "K" est 4b ... donc oui là on se demande quel rapport ...

Re: Mail, encodage html

Posté : 26 mars 2010, 12:18
par Albat90
Bonjour,

Merci pour vos réponses :)
Salut,

Et comme ceci ?
$lien = '<a href="http://www.*****.com/beta/?page=inscription3&key='.$key.'&parametre='.$para.'">http://www.record-forever.com/beta/?page=inscription3&key='.$key.'&parametre='.$para.'</a>';
J'ai effectivement testé comme ceci et j'ai toujours le même résultat.
J'ai aussi essayer de tout découper comme ceci :
$lien = '<a href="http://www.*****.com/beta/?page=';
$lien .= 'inscription3';
$lien .= '&key=';
$lien .= $key;
$lien .= '&parametre=':
$lien .= $para;
$lien .= '">http://www.*****.com/beta/?page=';
$lien .= 'inscription3';
$lien .= '&key=';
$lien .= $key;
$lien .= '&parametre=';
$lien .= $para;
$lien .= '</a>';
Tout en plaçant des htmlentities, specialchar etc... Mais le résultat est toujours le même.
le minimum serait de remplacer les & par des &

Essaie ce que j'ai dis, ça ne coûte rien, et si ça ne fonctionne pas, ça écartera cette hypothétique problème.
J'ai l'impression que ce n'est pas une question de "&". En effet, c'est l'enchainement de "=" avec un chiffre et une lettre comme "=4b" qui donne "K".
Orange :
http://www.****.com/beta/?page=inscription3&key=5&parametreKab6457407e44.83329098
Normalement, il devrait m'afficher :
http://www.****.com/beta/?page=inscription3&key=5&parametre=4bab6457407e44.83329098

A SAVOIR que le code hexadecimal ASCII de "K" est 4b ... donc oui là on se demande quel rapport ...
En effet, j'ai remarqué aussi. C'est pour cette raison que lorsque que je fais "=**4bab...", orange me laisse le lien telle qu'elle sans faire de conversion ASCII.
Cependant, je ne comprends pas pourquoi Hotmail, lui, me mange toujours deux caractères après le "=".

J'ai essayé aussi d'écrire "=" comme ceci "&equal;" si je ne me trompe pas. Par contre, aucune des deux messageries me les convertie et je me retrouve avec un lien comme ceci :
http://www.****.com/beta/?page&equal;inscription3&key&equal;5&parametre&equal;4bab6457407e44.83329098


Je vais tout de même essayer de changer l'entête de mon mail, mais j'ai l'impression que l'entête du serveur de messagerie prend la priorité par rapport à la mienne. :(

Albat90 ;)

Re: Mail, encodage html

Posté : 26 mars 2010, 15:59
par Dr@ke
Sinon tu peux utiliser l'url rewriting pour ce type de liens, de cette façon tu insères un lien sans query strings dans le mail.

http://www.webrankinfo.com/dossiers/tec ... -rewriting

PS:
Ce n'est peut-être pas la solution idéale mais si ce problème arrive juste pour certains liens dans des emails, autant ne pas se compliquer la vie :wink:

Sinon encore une fois, je déconseille d'utiliser htmlspecialchar(), htmlentities() et équivalent en manuel dans un mail pour les raisons que j'ai cité dans mon post précédent.


[EDIT]
Ou peut-être plus simple ici:
Tu fais une simple page avec une redirection vers cette page.
Et donc tu insères le lien de la page de redirection dans le mail.

Re: Mail, encodage html

Posté : 26 mars 2010, 16:59
par Albat90
Plop,

Finalement, j'ai refais toute l'entête en ajoutant une possibilité d'afficher en texte si le navigateur n'accepte pas le HTML.

J'ai bien l'impression que le problème venait de la limite, ou peut être bien autre chose. Quoi qu'il en soit, ça restera toujours un mystère pour moi :)

Pour les personnes qui veulent un code testé :
$site = "www.*****.com";
		$from = "anonymous@*****.amenworld.com";
		$nom = "*****.com";
		$to = $email; //passé en paramètre dans la fonction
		$sujet = "Validation email";
		$text = "*****.com vous remercie de la confiance que vous lui accorder. Afin de poursuivre votre inscription, une vérification de votre adresse email est nécessaire.
		Veuillez faire un copier/coller du lien-ci dessous dans la barre d'adresse pour valider votre adresse email et continuer votre inscription.
		http://www.*****.com/beta/?page=inscription3&key=$key&parametre=$para";
		$html = $messtxt;

		$from = $nom." <".$from.">";

		$limite = "_----------=_parties_".md5(uniqid (rand()));

		$header  = "Reply-to: ".$from."\n";
		$header .= "From: ".$from."\n";
		$header .= "X-Sender: <".$site.">\n";
		$header .= "X-Mailer: PHP\n";
		$header .= "X-auth-smtp-user: ".$from." \n";
		$header .= "X-abuse-contact: ".$from." \n";
		$header .= "Date: ".date("D, j M Y G:i:s O")."\n";
		$header .= "MIME-Version: 1.0\n";
		$header .= "Content-Type: multipart/alternative; boundary=\"".$limite."\"";

		$message = "";

		$message .= "--".$limite."\n";
		$message .= "Content-Type: text/plain\n";
		$message .= "charset=\"iso-8859-1\"\n";
		$message .= "Content-Transfer-Encoding: 8bit\n\n";
		$message .= $text;

		$message .= "\n\n--".$limite."\n";
		$message .= "Content-Type: text/html; ";
		$message .= "charset=\"iso-8859-1\"; ";
		$message .= "Content-Transfer-Encoding: 8bit;\n\n";
		$message .= $html;

		$message .= "\n--".$limite."--";
		if(mail($to, $sujet, $message, $header)) return true;
		else return false;
Voila, tout fonctionne :)

Merci à tous pour vos réponses.

Cordialement, Albat90 ;)

Re: Mail, encodage html

Posté : 26 mars 2010, 17:29
par Dr@ke
Le Content-Type: multipart/alternative permet notamment de mettre deux versions dans ton mail.
Par exemple, une version html et une version texte, donc si tu mets juste une version html, cela risque de bugguer ensuite...
Et il est souvent conseillé quand on envoie un mail au format html de mettre une version texte.
Mais je pense que cela aurait été correct si tu avais envoyé ton mail qu'au format html et donc en enlevant le Content-Type: multipart/alternative...

Ce qui explique surement en partie le bug que tu avais.

Re: Mail, encodage html

Posté : 26 mars 2010, 17:51
par Albat90
Effectivement, tout parait plus claire maintenant.

En effet, à l'origine, dans la première fonction que j'avais, il y avait quelque ligne pour un affichage alternatif en texte.
Vue que j'ai supprimé cette partie, je pense que tout était mal interprété :)

Merci de m'avoir éclairé à ce sujet ^^