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.

Vraiment intéressant ce script, par contre ça ne semble pas fonctionner avec hotmail, ça reste bloqué, as-tu une solution ?
Il faudrait l’ip du serveur SMTP ayant accès aux adresses des utilisateurs, dans certain cas, les MX renseignés ne sont que des relais et ne savent pas si l’utilisateur existe ou non. Cela dit, ça peut être considéré comme une faille, et donc proscrit pour certaine boite (dont M$), chose étrange, ça marche pour Google …