Mail, encodage html

Eléphant du PHP | 145 Messages

25 mars 2010, 16:42

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 ;)
La culture, c'est comme la confiture, moins on en a, plus on l'étale.

devlop78
Invité n'ayant pas de compte PHPfrance

25 mars 2010, 17:33

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)

ViPHP
ViPHP | 2291 Messages

25 mars 2010, 19:11

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>';
ImageCe que l'on apprend par l'effort reste toujours ancré beaucoup plus longtemps.

devlop78
Invité n'ayant pas de compte PHPfrance

26 mars 2010, 01:20

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.

Mammouth du PHP | 985 Messages

26 mars 2010, 01:28

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...
Face à la roche, le ruisseau l'emporte toujours, non pas par la force mais par la persévérance.

devlop78
Invité n'ayant pas de compte PHPfrance

26 mars 2010, 04:57

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 ...

Eléphant du PHP | 145 Messages

26 mars 2010, 12:18

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 ;)
La culture, c'est comme la confiture, moins on en a, plus on l'étale.

Mammouth du PHP | 985 Messages

26 mars 2010, 15:59

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.
Face à la roche, le ruisseau l'emporte toujours, non pas par la force mais par la persévérance.

Eléphant du PHP | 145 Messages

26 mars 2010, 16:59

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 ;)
La culture, c'est comme la confiture, moins on en a, plus on l'étale.

Mammouth du PHP | 985 Messages

26 mars 2010, 17:29

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.
Face à la roche, le ruisseau l'emporte toujours, non pas par la force mais par la persévérance.

Eléphant du PHP | 145 Messages

26 mars 2010, 17:51

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 ^^
La culture, c'est comme la confiture, moins on en a, plus on l'étale.