Bonjour.
J'espère ne pas faire du hors-sujet, mais si je comprends une partie du problème, tu veux savoir si une adresse email existe.
Bon, alors on sait faire, c'est pas ultra compliqué, faut connaître.
J'ai fais une classe comme ça (bientôt le site avec _toutes_ les publications, ça arrive

), voici ce qu'elle fait.
Elle valide une adresse email selon différents niveaux :
- 1. isWellFormed : on test tout simplement la syntaxe ;
2. isMxRecord : est-ce qu'un enregistrement MX correspond à notre adresse ;
3. isSMTP : est-ce que le domaine fournit est bien un SMTP ;
4. isVerified : on regarde sur le server SMTP que l'adresse existe bien.
Comment on procède ?
Préambule :
On a les variables
$this->address et
$this->domain qui contiennent l'adresse et le domaine de l'email. On a également la variable
$this->timeout pour les sockets.
1. isWellFormed :
On fait un test (à l'aide de preg_match par exemple) sur ta variable
$mail.. On test l'expression suivante :
Pourquoi une extension de 2 à 6 caractères ? Les .museum existe
2. isMxRecord :
On a deux solutions.
Soit on utilise la fonction
getmxrr() et on exploite le résultat, soit la fonction n'existe pas et on tente alors une commande. La fonction existe sur tous les systèmes Unix sauf sous Windows (d'où la commande MS-DOS).
Tu devrais avoir quelque chose qui ressemble à ça pour exploiter le getmxrr :
if(function_exists('getmxrr')) {
if(!getmxrr($this->domain, $name, $weight))
return Fw::raiseError('getmxrr(); return false.', 1);
foreach($name as $key => $value) {
if(!isset($w)) {
$w = $weight[$i];
$mx = $name;
}
elseif($weight < $w) {
$w = $weight[$i];
$mx = $name;
}
}
}
Sinon on lance la commande
`nslookup -type=MX $esad 2>nul` pour Windows :
else {
$esad = escapeshellarg($this->domain);
$ns = `nslookup -type=MX $esad 2>nul`;
if(preg_match_all("#^(.*)\tMX preference = (\d+), mail exchanger = (.*)$#im",
$ns, $lines, PREG_SET_ORDER) === FALSE)
return Fw::raiseError('Cannot preg_match_all `nslookup`', 2);
foreach($lines as $line) {
if($line[1] != $this->domain)
continue;
$name = $line[3];
$weight = intval($line[2]);
if(!isset($w)) {
$w = $weight;
$mx = $name;
}
elseif($weight < $w) {
$w = $weight;
$mx = $name;
}
}
}
Au final, si la variable
$mx est vide, alors on retourne faux, sinon on retourne vrai.
3. isSMTP :
Rien de compliqué, on regarde juste si le server existe bien.
$fsop = fsockopen('tcp://'.$this->mx, 25, $this->errno, $this->errstr, $this->timeout);
if($this->timeout)
stream_set_timeout($fsop, $this->timeout);
if(Fw::isError($this))
return FALSE;
fclose($fsop);
$this->mx correspond au $mx trouvé précédement (comme c'est par niveau, le niveau précédement est forcément exécuté).
4. isVerified :
On ouvre encore la connexion vers tcp://... comme vu en 3, mais on va exécuter des requêtes SMTP.
On va faire :
Code : Tout sélectionner
EHLO SweetYety
VRFY $this->address
// on récupère le code
QUIT
On analyse le code, si le code appartient à l'intervalle [200; 300[ (soit [200; 299]) alors on n'a pas d'erreur, sinon l'adresse n'est pas vérifiée.
Voilà, c'est quelques petites méthodes qui pourront peut être t'être utiles

Je suis pas trop rentré dans les détails, j'ai juste expliqué en partie mon code, mais t'as déjà des astuces à exploiter.
Avec tout ça tu peux vérifier la validité d'une adresse email.
Si ton adresse email est valide, le courier a déjà plus de chance d'arriver.
Comme en général, les 99.99% des adresses emails données par les robots sont fausses, c'est déjà un bon moyen de les contourner. Si à ça, tu ajoutes un "anti-spam au niveau de l'écriture" (on encode les adresses et autres), tu as très peu de chance de te faire spammer.
Voilà, j'espère ne pas avoir fait de hors-sujet ^^ (sinon c'est pas perdu, ça peut toujours servir à quelqu'un d'autre

)
Bonne journée.
Edit : Je me suis rendu compte que mon exploitation de getmxrr est complètement fausse lol ^^ J'ai écris comme ça, je l'ai pas testé ; j'étais partis sur autre chose et en modifiant j'ai pas fais gaffe. Mais là jdois partir, donc j'ai pas le temps de refaire un petit bout de code. Fait un print_r de $name et tu verras comment l'exploiter. Le but est de prendre le MX avec la référence la plus petite (il faut voir le résultat pour le comprendre

) Je te conseille de regarder dans ton MS-DOS (si sous Win) pour mieux comprendre.
Désolé, re-bonne journée.