<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Blog personnel de Jérémy TRUFIER &#187; PHP</title>
	<atom:link href="http://www.jeremy-trufier.net/category/web/developpement/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.jeremy-trufier.net</link>
	<description>Un blog utilisant WordPress</description>
	<lastBuildDate>Fri, 01 Apr 2011 16:50:32 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1</generator>
		<item>
		<title>PHP, vérification de mail complète, avec DNS</title>
		<link>http://www.jeremy-trufier.net/2010/09/24/php-verification-de-mails-complete-avec-dns/</link>
		<comments>http://www.jeremy-trufier.net/2010/09/24/php-verification-de-mails-complete-avec-dns/#comments</comments>
		<pubDate>Fri, 24 Sep 2010 14:00:26 +0000</pubDate>
		<dc:creator>Jérémy TRUFIER</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[astuce]]></category>
		<category><![CDATA[développement]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[regexp]]></category>
		<category><![CDATA[vérification]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://www.jeremy-trufier.net/?p=156</guid>
		<description><![CDATA[gMail permet de rajouter un &#171;&#160;+cequonveut&#160;&#187; juste avant le @, ainsi toto+nimportequoi@gmail.com est la même chose que toto@gmail.com, cela peut-être très utile pour savoir de qui viennent les spams, ou encore savoir qui vend illégalement des listes d&#8217;adresses. J&#8217;ai ainsi prit l&#8217;habitude à chaque inscription sur un site ou une newsletter de rajouter le nom [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright size-medium wp-image-168" title="appleMail" src="http://www.jeremy-trufier.net/wp-content/uploads/2010/09/appleMail-300x300.png" alt="" width="150" height="150" /></p>
<p>gMail permet de rajouter un &laquo;&nbsp;+cequonveut&nbsp;&raquo; juste avant le @, ainsi toto+nimportequoi@gmail.com est la même chose que toto@gmail.com, cela peut-être très utile pour savoir de qui viennent les spams, ou encore savoir qui vend illégalement des listes d&#8217;adresses. J&#8217;ai ainsi prit l&#8217;habitude à chaque inscription sur un site ou une newsletter de rajouter le nom du site après le +, exemple : monprenom.monnom+gizmodo.fr@gmail.com . Si un jour je reçois du spam sur cette adresse je saurais donc à qui m&#8217;en prendre ! Bien entendu les applications sont multiples et variées, notamment avec l&#8217;application des filtres ! Ainsi quand j&#8217;envois un mail à monprenom.monnom+note@gmail.com je le reçois directement (grâce à un filtre) dans mon dossier Notes&#8230; De la même façon il est possible de rajouter des points n&#8217;importe où dans l&#8217;adresse, gmail ne fera pas la différence ! ex: mon.prenom.mon.n.o.m@gmail.com est l&#8217;équivalent de monprenom.monnom@gmail.com lui même équivalent à monprenommonnom@gmail.com !</p>
<p>Mais il y a un petit hic dans tout ça ! Beaucoup de sites n&#8217;acceptent pas des emails avec des + ou d&#8217;autres caractères spéciaux !</p>
<p>Valide ou pas valide alors ???</p>
<h2><span id="more-156"></span></h2>
<h2>Normes</h2>
<p><img class="alignleft size-thumbnail wp-image-170" title="elephant-elephant-php-logo" src="http://www.jeremy-trufier.net/wp-content/uploads/2010/09/elephant-elephant-php-logo-150x150.png" alt="" width="100" height="100" />Voici donc un petit tuto bien sympathique en php, une vérification de mail&#8230;<br />
&laquo;&nbsp;Mais il en traine plein sur internet ???&nbsp;&raquo;</p>
<p>et même PHP fournit une fonction déjà toute prête pour vérifier les mails :</p>
<pre>filter_var($email, FILTER_VALIDATE_EMAIL)</pre>
<p>Et oui, mais les adresses emails sont régis par des normes RFC5321 et RFC5322, des documents imbuvables que personne ne lit jamais&#8230; Du coup, il est rare qu&#8217;un regexp soit en accord avec ces normes, à vrai dire, il semblerait bien qu&#8217;il n&#8217;y en ai qu&#8217;un seul qui respecte ces normes (celui de <a href="http://squiloople.com/" target="_blank">Michael Rushton</a>). La fonction <span style="font-family: Consolas, Monaco, 'Courier New', Courier, monospace; line-height: 18px; font-size: 12px; white-space: pre;">filter_var</span> avec <span style="font-family: Consolas, Monaco, 'Courier New', Courier, monospace; line-height: 18px; font-size: 12px; white-space: pre;">FILTER_VALIDATE_EMAIL</span> ne prenait pas du tout en compte ces normes là et majorité d&#8217;emails sortant de l&#8217;ordinaire étaient invalides pour elle. Depuis le 2 avril 2010 (<a href="http://svn.php.net/viewvc/php/php-src/trunk/ext/filter/logical_filters.c?revision=297350&amp;view=markup#l499" target="_blank">révision 297350 de php</a>), ce regexp est inclut directement avec cependant quelques petites suppressions dans FILTER_VALIDATE_EMAIL. Toutefois, la version de PHP contenant cette mise à jour n&#8217;et pas encore sortie.</p>
<p>Ce que nous allons faire aujourd&#8217;hui est utiliser ce regexp pour vérifier nos adresses emails, mais également vérifier si le nom de domaine utilisé dans l&#8217;adresse email existe et est enregistré sur les serveurs DNS.</p>
<h2>Application</h2>
<h3>Le Regexp</h3>
<p>Voici le fameux regexp en php (accrochez-vous bien) :</p>
<blockquote>
<pre>$regexp = '/^(?!(?:\x22?(?:\x5C[\x00-\x'
.'7E]|[^\x22\x5C])\x22?){255,})(?!(?:\x'
.'22?(?:\x5C[\x00-\x7E]|[^\x22\x5C])\x2'
.'2?){65,}@)(?:[\x21\x23-\x27\x2A\x2B\x'
.'2D\x2F-\x39\x3D\x3F\x5E-\x7E]+|(?:\x2'
.'2(?:[\x01-\x08\x0B\x0C\x0E-\x1F\x21\x'
.'23-\x5B\x5D-\x7F]|\x5C[\x00-\x7F])*\x'
.'22))(?:\.(?:[\x21\x23-\x27\x2A\x2B\x2'
.'D\x2F-\x39\x3D\x3F\x5E-\x7E]+|(?:\x22'
.'(?:[\x01-\x08\x0B\x0C\x0E-\x1F\x21\x2'
.'3-\x5B\x5D-\x7F]|\x5C[\x00-\x7F])*\x2'
.'2)))*@(?:(?:(?!.*[^.]{64,})(?:(?:xn--'
.')?[a-z0-9]+(?:-[a-z0-9]+)*\.){0,126}('
.'?:xn--)?[a-z0-9]+(?:-[a-z0-9]+)*)|(?:'
.'\[(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::['
.'a-f0-9]{1,4}){7})|(?:(?!(?:.*[a-f0-9]'
.'[:\]]){8,})(?:[a-f0-9]{1,4}(?::[a-f0-'
.'9]{1,4}){0,6})?::(?:[a-f0-9]{1,4}(?::'
.'[a-f0-9]{1,4}){0,6})?)))|(?:(?:IPv6:('
.'?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){'
.'5}:)|(?:(?!(?:.*[a-f0-9]:){6,})(?:[a-'
.'f0-9]{1,4}(?::[a-f0-9]{1,4}){0,4})?::'
.'(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,'
.'4}:)?)))?(?:25[0-5]|2[0-4][0-9]|1[0-9'
.']{2}|[1-9]?[0-9])(?:\.(?:25[0-5]|2[0-'
.'4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}))\'
.']))$/iD';'</pre>
</blockquote>
<p style="text-align: center;"><a href="http://www.jeremy-trufier.net/wp-content/uploads/2010/09/regexp0.png" rel="lightbox[156]"><img class="size-medium wp-image-171 aligncenter" title="regexp0" src="http://www.jeremy-trufier.net/wp-content/uploads/2010/09/regexp0-300x80.png" alt="" width="300" height="80" /></a></p>
<p>Alors ça rigole moins là hein ! Bon je ne vais pas détailler l&#8217;expression, sachez juste qu&#8217;elle permet de vérifier notre mail selon les dernières normes RFC (sauf cas particulier non connus).</p>
<p>Et maintenant on va faire appel à une fonction bien pratique en php : checkdnsrr qui va vérifier l&#8217;enregistrement DNS en champs MX (domaines pour les mails) de ce qu&#8217;on lui passe en paramètre. &laquo;&nbsp;afzxgdegedsgesd.com&nbsp;&raquo; renverra FALSE tandis que &laquo;&nbsp;gmail.com&nbsp;&raquo; renverra TRUE :</p>
<pre>
<blockquote>

$domain=substr(strchr($email,'@'),1); //on récupère la partie après le dernier @
if(checkdnsrr($domain,'MX')) //on vérifie l'enregistrement
return true; //tout est bon on retourne TRUE</blockquote>
</pre>
<p>Notre fonction complète sera donc :</p>
<pre>
<blockquote>

function checkMail($mail){
	$regexp = '/^(?!(?:\x22?(?:\x5C[\x00-\x'
	.'7E]|[^\x22\x5C])\x22?){255,})(?!(?:\x'
	.'22?(?:\x5C[\x00-\x7E]|[^\x22\x5C])\x2'
	.'2?){65,}@)(?:[\x21\x23-\x27\x2A\x2B\x'
	.'2D\x2F-\x39\x3D\x3F\x5E-\x7E]+|(?:\x2'
	.'2(?:[\x01-\x08\x0B\x0C\x0E-\x1F\x21\x'
	.'23-\x5B\x5D-\x7F]|\x5C[\x00-\x7F])*\x'
	.'22))(?:\.(?:[\x21\x23-\x27\x2A\x2B\x2'
	.'D\x2F-\x39\x3D\x3F\x5E-\x7E]+|(?:\x22'
	.'(?:[\x01-\x08\x0B\x0C\x0E-\x1F\x21\x2'
	.'3-\x5B\x5D-\x7F]|\x5C[\x00-\x7F])*\x2'
	.'2)))*@(?:(?:(?!.*[^.]{64,})(?:(?:xn--'
	.')?[a-z0-9]+(?:-[a-z0-9]+)*\.){0,126}('
	.'?:xn--)?[a-z0-9]+(?:-[a-z0-9]+)*)|(?:'
	.'\[(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::['
	.'a-f0-9]{1,4}){7})|(?:(?!(?:.*[a-f0-9]'
	.'[:\]]){8,})(?:[a-f0-9]{1,4}(?::[a-f0-'
	.'9]{1,4}){0,6})?::(?:[a-f0-9]{1,4}(?::'
	.'[a-f0-9]{1,4}){0,6})?)))|(?:(?:IPv6:('
	.'?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){'
	.'5}:)|(?:(?!(?:.*[a-f0-9]:){6,})(?:[a-'
	.'f0-9]{1,4}(?::[a-f0-9]{1,4}){0,4})?::'
	.'(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,'
	.'4}:)?)))?(?:25[0-5]|2[0-4][0-9]|1[0-9'
	.']{2}|[1-9]?[0-9])(?:\.(?:25[0-5]|2[0-'
	.'4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}))\'
	.']))$/iD';

	if(!preg_match($regexp, $mail))
		return false;

	$domain=substr(strchr($email,'@'),1);
	return checkdnsrr($parts[1], "MX");
}</blockquote>
</pre>
<p>Elle est jolie, non ?</p>
<p>Le mail suivant est donc valide : $%^%JerE_my*&amp;&amp;1@gmail.com</p>
<p>Mais celui là non : !def!xyz%abc@@gmail.com</p>
<h2>Conclusion</h2>
<p><a href="http://www.jeremy-trufier.net/wp-content/uploads/2010/09/16a.jpg" rel="lightbox[156]"><img class="alignleft size-full wp-image-172" title="16a" src="http://www.jeremy-trufier.net/wp-content/uploads/2010/09/16a.jpg" alt="" width="150" height="150" /></a>Vous savez désormais créer une fonction de validation mail digne de ce nom, quelques améliorations peuvent y être apportée, principalement vérifier si la partie après le dernier @ est une IP (ipv4, ipv6, &#8230;) ou un domaine composé, dans ce cas il ne faut pas faire la vérification de champs MX car elle n&#8217;aboutira à rien.</p>
<p>Mais au moins n&#8217;importe qui pourra entrer ces adresses spéciales sans que ce ne soit considéré comme invalide. Du moins en attendant que le dernier FILTER_VALIDATE_EMAIL intégré à PHP ne sorte.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jeremy-trufier.net/2010/09/24/php-verification-de-mails-complete-avec-dns/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
<!-- WP Super Cache is installed but broken. The path to wp-cache-phase1.php in wp-content/advanced-cache.php must be fixed! -->