L'envoi des emails est souvent délicat, car on ne sait pas quel client mail utilise le destinataire : serait-il capable d'afficher l'HTML, ne prend-t-il en charge que le texte ?
Pour palier à ce problème, il existe une méthode simple qui permet d'envoyer le mail à la fois en Texte et en HTML, et le client mail choisir la partie qui l'intéresse.
Au début, je me suis beaucoup inspiré de cette fonction de Nexen qui marche bien dans la plupart des cas, mais pose encore des cas dans certains webmail (Free de mémoire).
Donc en cherchant un peu, je me suis mis à tester les emails dans tous les sens pour arriver à une fonction qui marche bien.
Il suffit donc d'avoir une variable pour le contenu en texte et une autre pour le contenu en HTML et le tour est joué. (En passant par une fonction qui le fait, c'est super rapide...)
Voici donc le bout de code (brut de pomme, c'est extrait d'une grosse classe...) : a vous de remettre ça en fonction ou de l'utiliser comme bon vous semble !
$site = "www.machin.com";
$from = "exp@machin.com";
$nom = "Expéditeur";
$to = "dest@machin.com";
$sujet = "Hello !";
$text = "Hello every Body !!!";
$html = "Hello !
";
$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."--";
mail($to, $sujet, $message, $header);
Vous l'aurez compris, le contenu en texte doit être dans $text et celui en HTML dans $html Vous pouvez aussi modifié pour changer le mail de l'abuse (je ne sais pas si c'est bien efficace, si les anti-spam se base dessus à 1 moment donné ou pas.) Enfin, le fait de dire de quel site vient le mail permet d'éviter dans la plupart des cas d'être considéré par du spam par Hotmail.
Enfin, on fait la coupure entre les 2 mails (car c'est bien ça : un mail en texte et un mail en HTML dans un seul) grâce à Content-Type: multipart/alternative; boundary="$limite" qui indique que le mail contient différents formats et que ces parties sont délimités par $limite. Puis dans l'email en lui-même, après mettre la fameuse limite, on indique le type du mail (texte ou html). Et voilà le tour est joué !
Si vous avez des problèmes, des suggestions ou bien si vous utilisez ce bout de code, merci de laisser un commentaire ;)
Commentaires.
#1 par Greg
Parfait tout ca, je vais l'intégré de ce pas sur le plugin dotclear ;)
merci
le Mercredi 06 Septembre 2006 à 09:22:43
#2 par druidev
Hey sympa, fallait y penser ;)
le Mercredi 06 Septembre 2006 à 09:35:28
#3 par Greg
et pourquoi ne pas mettre dans $from = "MonNom ";
avant $message = "";
sa devrait bien passé sans problème non ?
le Mercredi 06 Septembre 2006 à 11:08:27
#4 par Nyro
Oui pas bête.
J'ai modifié pour ajouter la variable $nom et toutes les variables demandées pour l'email.
Et puis j'ai aussi ramené toute lécriture des header du mail dans la variable $header pour plus de clarté
le Mercredi 06 Septembre 2006 à 11:24:38
#5 par Greg
heuu dans le content-type et le charstet en html t'a oublié le \n et tu as mis des ;
c'est volontaire ???
donc:
$message .= "\n\n--".$limite."\n";
$message .= "Content-Type: text/html;\n";
$message .= "charset=\"iso-8859-1\"\n";
$message .= "Content-Transfer-Encoding: 8bit\n\n";
$message .= $html;
le Mercredi 06 Septembre 2006 à 11:34:28
#6 par Nyro
Etrangement, si tu modifies comme tu dis (ce qui paraît logique au vu des lignes concernant le partie texte du mail), ça ne passe pas correctement avec ThunderBird. (Je viens de tester)
A vrai dire, je n'y avais jamais fais attention avant, mais ça fonctionne uniquement comme ça apparament.
le Mercredi 06 Septembre 2006 à 11:40:08
#7 par Greg
ok ok,
donc une dernière petite chose sur imp de chez free et su SquirrelMail y'a un problème de date du message
le mail se retrouve en bas de la liste vu que la date est indéchiffrable ... :/
sur différent mail le bon format est :
Date: Mon, 28 Aug 2006 15:39:26 +0200
et non:
Date : Wednesday 6 September 2006, 12:01
le Mercredi 06 Septembre 2006 à 12:04:48
#8 par Nyro
Pour l'heure et le jour, tu sais si c'est avec ou sans les zéros initiaux ?
En attendant, j'ai modifié en fonction de ce que tu m'as dis, merci
le Mercredi 06 Septembre 2006 à 12:18:35
#9 par Greg
Sans les zéro:
Mon, 4 Sep 2006 22:39:09 +0200
c'est de l'heure sur une base 24 !
le Mercredi 06 Septembre 2006 à 12:26:02
#10 par Nyro
C'est modifié (et testé avec le webmail de free)
le Mercredi 06 Septembre 2006 à 12:40:14
#11 par Ciprian
Bonjour,
Pour l'envoi de mail, je conseille la classe PHPmailer (phpmailer.sourceforge.net...).
Ca évite d'avoir à gérer les headers manuellement, ça permet d'attacher une pièce jointe à l'email codée directement dans le corps du message, etc.
Dans le cas d'utilisation d'un formulaire avec envoi de mail, il est important de valider les données fournies par l'utilisateur pour éviter le spam, etc. Pour ce faire, il existe une classe de "sanitization" : OWASP PHP Project : www.owasp.org/index.php/C...
Sans oublier bien entendu Captcha pour éviter les soumissions automatiques des formulaires par des robots.
Bon développement !
Ciprian
le Jeudi 26 Octobre 2006 à 12:17:02
#12 par gvosnet
Bonjour,
J'ai malgré tout un soucis avec le webmail de Free :
Si je mets un lien sur une image (genre ), mon mail n'arrive jamais dans la boite Free alors que cela fonctionne très bien avec les autres hébergeurs (gmail et autres...).
Y'aurait-il une raison spéciale ?
le Lundi 20 Novembre 2006 à 15:28:29
#13 par gvosnet
Au temps pour moi, tout était dans le "Etrangement, si tu modifies comme tu dis (ce qui paraît logique au vu des lignes concernant le partie texte du mail), ça ne passe pas correctement avec ThunderBird. (Je viens de tester)"
le Lundi 20 Novembre 2006 à 15:40:02
#14 par Nyro
Je viens d'essayer en copiant/collant le code donné dans le billet, et aucun problème.
D'ailleurs je vois que tu as reposté un commentaire, pour dire que c'était bon.
Enchanté que mon billet ait pu t'aider.
le Lundi 20 Novembre 2006 à 15:52:44
#15 par Bartabat
Salut,
Merci beaucoup pour ce bout de code, j'ai cherché une bonne partie de l'après-midi la syntaxe qui permettait l'envoie de mail HTML et texte et surtout qui fonctionnait partout. Tu est le premier qui passe le fameux test du webmail d'hotmail :)
Bonne continuation
le Lundi 02 Avril 2007 à 17:41:49
#16 par Nicolas Simier
On cherche depuis longtemps cette fonction pour ma boîte où je taf. Par contre j'ai un problème pour un client, le mail que j'envoi passe en spam sur hotmail et gmail. Comme expéditeur j'ai une adresse du type : info@xxxx.fr, le sujet "Lissac Opticien", et un mail en html basique. As-tu une idée sur ça ? C'est vraiment chiant que ça passe en spam !!!
le Mardi 17 Avril 2007 à 09:38:52
#17 par Nyro
Est-ce que la variable $site correspond à ce que tu as après le @ dans le mail de l'expéditeur ?
car c'est un critère déterminant pour Hotmail d'après mes souvenirs.
le Mardi 17 Avril 2007 à 11:18:53
#18 par Nico
Oui oui j'ai bien ça !
le Mardi 17 Avril 2007 à 14:34:16
#19 par Odisseus
Exactement ce que je cherchais depuis un moment, merci beaucoup.
le Jeudi 19 Avril 2007 à 18:52:24
#20 par flo
et comment on fait pour les caractères spéciaux è é à ç ù ê â ?
le Mercredi 25 Avril 2007 à 12:07:50
#21 par Nyro
Pour la partie texte, aucun problème.
Pour la partie HTML, il faut simplement convertir ces caractères dans leur équivalent d'entités HTML, avec la fonction htmlentities www.php.net/manual/fr/fun...
le Mercredi 25 Avril 2007 à 12:30:15
#22 par Courbey
Bravo tres bon script !!
le Vendredi 06 Juillet 2007 à 13:53:14
#23 par http://www.stockindexonline.com
Ton captcha a l'air de bien fonctionner. Le mien refuse d'afficher les images, et il laisse passer les messages même si la réponse est fausse. Si on ne répond pas, il ne laisse pas partir le commentaire (donc il marche un peu quand même). Il laisse aussi passer les commentaires de certains robots Tu as modifié quelque chose avant de l'installer ? C'est aussi un thème alto, il est super beau ce thème.
Merci.
le Mardi 06 Novembre 2007 à 00:16:17
#24 par http://www.stockfootageonline.com
je n'ai rien fais de plus que de l'installer comme indiqué dans la procedure d'install, creation de la requete sql, ajout dans le fichier form.php et parametrage du fichier config.php
le Mardi 06 Novembre 2007 à 00:18:26
#25 par Nyro
Je n'ai rien modifié au script de Captcha trouvé ici : www.atelierphp5.com/un-ca...
Il a fonctionné directement pour moi, après la procédure d'installation indiqué dans le gestionnaire de plugins Dotclear (si je me souviens bien, ça fait longtemps)
Regarde peut-être du côté de ta configuration serveur.
Je ne peux pas t'en dire plus...
Le thème a été créer spécialement pour ce blog pour moi par un ami : www.nyrodev.info/index.ph...
le Mardi 06 Novembre 2007 à 00:25:38
#26 par Footage Software
effectivement cela regle seulement le spam sur les commentaires. j'etudie une soluce pour les trackback, je vous tiens au courant
le Mardi 06 Novembre 2007 à 00:25:51
#27 par Cottages and Castles
@Footage Software: rien fait de particulier, juste installé le plugin et suivi les instructions :-(
On est sous dotclear 1.2.x, peut-être est-ce différent avec la version 2.0 ??
Ceci dit, il laisse parfois passer des commentaires, il est donc doublé avec Spamplemousse : ceinture+bretelle ;-)
le Mardi 12 Février 2008 à 15:36:48
#28 par Digital Image Library Software
salut !
vraiment intuitif ce truc !
c'est génial merci !
le Mardi 26 Février 2008 à 10:43:25
#29 par testeur
hello,
tres comme script, ca fonctinne a merveille.
j'ais juste un truc d'étrange même si je défini le charset en UTF-8 j'ai des caracteres non converti au format txt mais c'est nikel en html.
une idée ?
le Dimanche 27 Avril 2008 à 15:14:28
#30 par Nyro
Utilisez utf8_encode lors de l'affectation du message à l'email et ça devrait fonctionner
le Dimanche 27 Avril 2008 à 19:52:47
#31 par sourivore
J'ai ce problème de mon côté :
Warning: mail() [function.mail]: SMTP server response: 550 5.1.0 '@' or '.' expected after 'Administrateur' in C:\Program Files\EasyPHP 2.0b1\www\framework\PHP\inscription\inscription2.php on line 40
Et le code est :
ini_set("SMTP","smtp.cegetel.net");
$site = "www.framework.com";
$from = "noreply@framework.com";
$nom = "Administrateur";
$to = "mon@email.com";
$sujet = "Hello !";
$text = "Hello every Body !!!";
$html = "Hello !";
$from = $nom." ";
$limite = "_----------=_parties_".md5(uniqid (rand()));
$header = "Reply-to: ".$from."\n";
$header .= "From: ".$from."\n";
$header .= "X-Sender: \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."--";
mail($to, $sujet, $message, $header);
Une idée?
le Lundi 16 Juin 2008 à 09:49:58
#32 par Nyro
J'ai testé avec ton code, en simplement enlevant la 1ère ligne pour changer le smtp.
Cela marche très bien pour moi.
L'erreur vient donc du serveur SMTP de cegetel qui n'a pas l'air d'aimer Adminstrateur
Pour résoudre le problème, tu peux tout d'abord essayer de commenter la ligne
$from = $nom." ";
Si cela marche, essaie chaque endroit ou la variable $from est utilisé pour remettre la valeur avec le nom.
Je pense que tu n'en a besoin que pour le From et le Reply-to
le Lundi 16 Juin 2008 à 19:13:07
#33 par Nook
Ouah!
Vraiment super, juste ce dont j'avais besoin, je te remercie!
J'arrivais jamais à obtenir un mail au bon format :)
encore merci!
le Lundi 01 Septembre 2008 à 22:11:49
#34 par doudi
Super, merci pour ce script simple et efficace, j'ai testé pas mal de scripts sans grand succès jusqu'à aujourd'hui !
Merci merci merci !
;-)
le Dimanche 12 Octobre 2008 à 10:06:20
#35 par Videos
J'essayais désespérément d'envoyer un mail en HTML, avec des images, mais sans succès!
Je ne sais pas pourquoi, mais ce script fonctionne, simple et efficace. Que demander de mieux? ;)
Merci!
le Dimanche 12 Octobre 2008 à 23:27:36
#36 par stevechewbacca
Bonjour,
j'utilise cette façon de faire mais depuis l'installation, certains destinataires ne reçoivent pas le mail complet au format text...
je ne comprends pas du tout pour quelles raisons... ça n'a pas l'aire de venir des champs récupérés dans ma BDD... c'est un mystere plutot gavant ...
aidez moi svp !!
merci ˆˆ
le Lundi 02 Mars 2009 à 14:30:27
#37 par ppplus
Bonjour,
Petit problème au niveau du score des anti-spam (test d'envoi de mail sur auth-results@verifier.port25.com)
L'analyse donne un résultat positif sur cela :
2.1 MISSING_MIME_HB_SEP BODY: Missing blank line between MIME header and body
Donc, il faut mettre une ligne blanche entre le header et le body du message. Mais je n'ai pas encore trouvé comment ! Si quelqu'un a une idée
le Vendredi 06 Mars 2009 à 14:13:20
#38 par pierrot
Hello,
Oui cool ce tuto, ca m'a bien aidé. Cependant j'ai deux question :
Faut-il mettre ou pas les \n ici
$message .= "\n\n--".$limite."\n";
$message .= "Content-Type: text/html; ";
le Lundi 01 Mars 2010 à 20:07:07
#39 par pierrot
Aussi, pouvez-vous m'expliqué ceci?
X-Sender, X-Mailer, X-auth-smtp-user et X-abuse-contract
$header .= "X-Sender: \n";
$header .= "X-Mailer: PHP\n";
$header .= "X-auth-smtp-user: ".$from." \n";
$header .= "X-abuse-contact: ".$from." \n";
Milles mercis
le Lundi 01 Mars 2010 à 20:13:12
#40 par Nyro
@pierrot :
les \n ne doivent pas être mis entre le content-type et le charset.
Par il devrait en avoir un entre le charset et le content encoding.
Pour le untilted[2], je ne sais pas trop quoi répondre... Il faut regarder de MIME-Type pour trouver une réponse.
Tous les header commençant par X- ne sont pas des standards, mais je les ais mis ici pour éviter au maximum de passer dans les spams, notamment d'hotmail.
le Mardi 02 Mars 2010 à 09:30:08
#41 par pierrot
Bonjour à tous
Ce code est super et je traille dessus à fond.
Cependant j'ai deux petites et dernières questions.
Si je mets ce genre de message dans ma variable $message:
$message = "coucou école",
Je ne reçois pas de message:
Par contre, si je ne mets pas la balise ...,
$message = "coucou école";
Ca marche!
Es-ce que les balise html head et body sont interdites? ou pas recommandées? Ne dois-je pas les utiliser pour l'envoi de message?
Deuxième question
J'aimerais etre sure qu'un attachment est attaché au message si le client n'a pas de messagerie configurée pour recevoir des messages au format html. Ceci de menaière a ce qu'il puisse lire un message convenable et proche de ce que je veux envoyer.
Comment puis-je donc le faire?
J'ai vu, plus haut" qu'il y a lien où je pourrais trouver des info
blog.jchristophe.fr/post/...
Mais ce lien retourne une page avec un message d'erreur
Voilà tout. Merci pour vos lumières
le Mardi 08 Juin 2010 à 10:09:33
#42 par synanceia
Bonjour,
Si vous encodez vos pages php en UTF-8 alors je vous recommande de faire appel à mail ainsi :
mail($destinataire, utf8_decode($sujet), utf8_decode($message), utf8_decode($headers)) ;
Merci pour cet article !
le Mardi 20 Juillet 2010 à 10:16:06
#43 par Patrick
Un script propre et qui marche bien. Merci. Y a tellement de gamins qui recopient n'importe quoi n'importe comment, ca provoque un taux de pollution sur le net abominable ... 90% d'internet mériterait amplement de disparaitre !
le Mercredi 28 Juillet 2010 à 12:28:12
#44 par synanceia
Bonjour,
Depuis quelques temps, les messages que j'envoie sont classés en "SPAM" par laposte.net et sont détruits par d'autres fournisseurs de messagerie.
Un conseil ?
le Dimanche 06 Février 2011 à 09:14:46
#45 par Anonyme
Bonjour,
Je n'est pas encore testé le script, mais je vous conseille de remplacer : date("D, j M Y G:i:s O") par date("r") qui crée directement la date au format RFC 2822.
Merci pour ce script, je vais le tester et surement l'installer sur mon site.
le Jeudi 18 Août 2011 à 01:02:26
#46 par Michel Baxter
Merci pour ce petit script, qui reste performant malgré les années! Un outil utile, permettant de visualiser les critères utilisés par spamassassin: http://spamassassin.apache.org/tests_3_3_x.html
le Mercredi 30 Mai 2012 à 16:06:42
Ajouter un commentaire.