Tester la validité d'une adresse email sans attendre de réponse de l'internaute

Contenu du snippet

Voilà, j'ai longuement cherché, et par désespoir, j'ai écrit la fonction testMail() qui va vous permettre de tester avec une relative pertinence la validité d'une adresse e-mail. (lors de la validation d'un formulaire d'inscription par exemple)

Elle effecute les vérifications suivantes :
- L'email n'est il pas vide ?
- Se compose t'il de caractères valides ?
- Le nom de domaine de l'adresse existe-t'il ?
- Que disent les enregistrements MX ?
- Le serveur SMTP (port 25) répond t-il ?
- Un mail de test est envoyé, que répond le serveur ?

Je n'ai pas utilisé la fonction SMTP VERIFY car désactivée sur la plus-part des serveurs.
Attention donc au fait que ce script envoie réellement un email de test (à personaliser) au destinataire.
Bien sur certains serveur SMTP accèptent toutes les adresses avant de les résoudre ...
Ces quelques tests permettront tout de même d'éliminer nombre de fausses adresses.

Source / Exemple :


<?php
	require 'Net/SMTP.php';

function checkEmail($email) { 
	// checks proper syntax 
	$regexp = "^([_a-z0-9-]+)(\.[_a-z0-9-]+)*@([a-z0-9-]+)(\.[a-z0-9-]+)*(\.[a-z]{2,4})$"; 

	if (!eregi($regexp, $email)) { 
		return false; 
	} 

	// gets domain name 
	list($username,$domain)=split('@',$email); 
	// checks for if MX records in the DNS 
	$mxhosts = array(); 
	if(!getmxrr($domain, $mxhosts)) { 
		// no mx records, ok to check domain 
		$fp=@fsockopen($domain,25,$errno,$errstr,30);
		if (!$fp) { 
			return false; 
		} else { 
			fclose($fp);
			return testMail($host,$email); 
		} 
	} else { 
		// mx records found 
		foreach ($mxhosts as $host) { 
			$fp=@fsockopen($host,25,$errno,$errstr,30);
			if ($fp) {
				fclose($fp);
				return testMail($host,$email); 
			} 
		} 
		return false; 
	} 
} 

function testMail($srv, $mail)
{
    
    $host = "mail.domain.ext";
    $from = 'user@domain.ext';
    $fromLine = "From: Service des inscriptions<$from>\n";
    $date = "Date: ".gmdate("D, d M Y H:i:s") . " GMT\n";
    $rcpt = "To: <$mail>\n";
    $subj = "Subject: Inscription\n";
    $body = "Bienvenu chez nous.";

    /* Create a new Net_SMTP object. */
    if (! ($smtp = new Net_SMTP($srv))) {
       // echo("Unable to instantiate Net_SMTP object\n");
		return false;
    }

    /* Connect to the SMTP server. */
    if (PEAR::isError($e = $smtp->connect())) {
       // echo($e->getMessage() . "\n");
		return false;
    }

    /* HELO to the SMTP server. */
    if (PEAR::isError($e = $smtp->helo($host))) {
       // echo($e->getMessage() . "\n");
		return false;
    }

    /* Send the 'MAIL FROM:' SMTP command. */
    if (PEAR::isError($smtp->mailFrom($from))) {
       // echo("Unable to set sender to <$from>\n");
		return false;
    }

    /* Address the message to each of the recipients. */
    if (PEAR::isError($res = $smtp->rcptTo($mail))) {
       // echo("Unable to add recipient <$mail>: " . $res->getMessage() . "\n<br />Error ".implode(": ",$smtp->getResponse()));
		return false;
    }

    /* Set the body of the message. */
    if (PEAR::isError($smtp->data($subj .$fromLine.$rcpt.$date. "\r\n" . $body))) {
       // echo("Unable to send data\n");
		return false;
    }

    /* Disconnect from the SMTP server. */
    $smtp->disconnect();
	return true;
}
 
 // Test the function
 echo checkEmail($_REQUEST['email'])?"L'email existe":"L'email est invalide!";
?>

Conclusion :


Ce code fonctionne avec PEAR installé et utilise le module Net_SMTP.
La fonction checkEmail() (appelée par testMail()) est issue du code (http://www.phpcs.com/code.aspx?ID=12782) de Romuald que je remercie.
Le reste provient de diverses autres sources sur le WEB.

Note: ce code est expérimental. N'hésitez donc pas à me faire part de vos commentaires.

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.