plopinou …
Il arrive toujours un jour où l’on doit checker la validité d’une adresse mail de façon sûr (plus qu’une simple vérification sur la validité du nom de domaine).
Pour ce faire il faut directement se connecter sur le SMTP du domaine de l’adresse mail via un socket en PHP et envoyer l’adresse mail à checker.
Le petit script :
-
<?php
-
/*
-
Error Code
-
-1 not an adress mail
-
-2 can't connect to SMTP
-
-3 no mx server found
-
-4 connection rejected
-
-5 our adress has been rejected
-
-6 this adress isn't valid
-
-7 problem with EHLO command
-
*/
-
function mailTester($mail)
-
{
-
if(preg_match("#^(.*)@(.*\.[a-z]{2,4})$#i",$mail,$ret))
-
{
-
$socket = socket_create(AF_INET, SOCK_STREAM, 0);
-
getmxrr($ret[2],$r);
-
if(count($r)==0)
-
{//try to connect directly to the server
-
@fsockopen($ret[2],"25",$er1,$er2,0.5); //can't use it with socket :s
-
if($er1>0)
-
return -3;//no mx server and no smtp server
-
$r[0]=$ret[2];
-
}
-
-
if(!socket_connect($socket,$r[0],"25"))
-
return -2;//can't connect
-
-
socket_recv($socket,$retour,1024,0);
-
$ret=getCodeMsg($retour);
-
if($ret[0]!=220)
-
return -4;
-
-
socket_write($socket,"EHLO google.com\n");
-
socket_recv($socket,$retour,1024,0);
-
$ret=getCodeMsg($retour);
-
-
if($ret[0]!=250)
-
return -7;
-
-
socket_write($socket,"MAIL FROM: <mailchecker@gmail.com>\n");
-
socket_recv($socket,$retour,1024,0);
-
$ret=getCodeMsg($retour);
-
-
if($ret[0]!=250)
-
return -5;
-
-
socket_write($socket,"RCPT TO: <".$mail.">\n");
-
socket_recv($socket,$retour,1024,0);
-
socket_write($socket,"quit\n");//bisou
-
$ret =getCodeMsg($retour);
-
socket_close($socket);
-
if($ret[0]==250)
-
return 1;
-
else
-
return -6;
-
}
-
return -1;//not an adress mail
-
}
-
-
function getCodeMsg($ret)
-
{
-
preg_match("#^([0-9]+) (.*)$#im",$ret,$tab);
-
array_shift($tab);
-
return $tab;
-
}
-
?>
et hop, c’est tout, y’a pas besoin de plus d’explication en plus je pense, au pire, il y a pas mal de doc sur le procotole SMTP. (Le domaine google.com et l’adresse mailchecker sont des fakes, mais il faut fournir des domaines existants et une adresse mail pour certain serveurs SMTP, google m’a semblé être le bon choix ^^).
Si c’est lent, c’est normal, suivant les serveurs SMTP, la vérification peut prendre entre 5secs et 30secs voir plus, pour des traitements sur des lots de mail (genre des newsletters), il est possible de faire une boucle sur les RCPT TO: pour les adresses mail d’un même domaine, ce qui permet d’utiliser la connexion courrantes et évite d’ouvrir un trop grand nombre de connexion sur le serveur en question.
















