Checker la validité d’une adresse mail en PHP via SMTP

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 :

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

2 réflexions sur « Checker la validité d’une adresse mail en PHP via SMTP »

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

Les commentaires sont fermés.