Controllare la validità di una email

di Gianni Tomasicchio - 10 settembre 2006

sicurezza email Regex

L'indirizzo email è uno tra i dati che più comunemente viene registrato da una applicazione web. E' importantissimo avere un modo per contattare e raggiungere i propri utenti ed una email è sicuramente il mezzo più veloce ed economico per farlo.

Il valore di un indirizzo email quindi non può essere sciupato da un errore di input dell'utente che magari ha sbadatamente inserito in un form di registrazione una email scorretta. Ma altre motivazioni, ben più serie, richiedono un controllo attento di un indirizzo email fornito dall'utente. Diversi sono i possibili problemi di sicurezza che possono incorrere nell'uso di un indirizzo email opportunamente "manipolato" da un malintenzionato.

Senza addentrarci nella problematica vediamo come poter eseguire dei minimi controlli su una stringa per verificare se essa realmente contiene un indirizzo email valido.

<?php
function chkEmail($email)
{
	// elimino spazi, "a capo" e altro alle estremità della stringa
	$email = trim($email);

	// se la stringa è vuota sicuramente non è una mail
	if(!$email) {
		return false;
	}

	// controllo che ci sia una sola @ nella stringa
	$num_at = count(explode( '@', $email )) - 1;
	if($num_at != 1) {
		return false;
	}

	// controllo la presenza di ulteriori caratteri "pericolosi":
	if(strpos($email,';') || strpos($email,',') || strpos($email,' ')) {
		return false;
	}

	// la stringa rispetta il formato classico di una mail?
	if(!preg_match( '/^[\w\.\-]+@\w+[\w\.\-]*?\.\w{1,4}$/', $email)) {
		return false;
	}

	return true;
}

$email = 'test@dominio.it';

if(chkEmail($email)) {
	echo 'Indirizzo email corretto';
}
else {
	echo 'Indirizzo email errato';
}
?>

Il precedente script PHP contiene la funzione chkEmail() che ha il compito di eseguire alcune verifiche sulla stringa passatagli come parametro. Ecco i test eseguiti:

  • eliminati gli spazi alle estremità della stringa con trim() controllo che essa non sia vuota
  • contando il numero di @ presenti nella stringa verifico che essa contiene una sola email
  • cerco eventuali caratteri "pericolosi": punto e virgola, virgola, spazio
  • con una espressione regolare controllo il formato dell'indirizzo email. Questo test è per certi versi ridondante e potrebbe portare in rari casi a dei falsi positivi.

L'utilizzo della fuzione chkEmail(), mostrato nelle ultime righe dell'esempio, è molto semplice. Basta passare la stringa contenente l'indirizzo email e verificare il risultato ottenuto: true in caso di email corretta, false altrimenti.

7 commenti

1 Diego Diego sabato 15 maggio 2010, ore 14:19
Da PHP 5.3 basta utilizzare la funzione nativa:
2 mattia cortese mattia cortese venerdž 1 ottobre 2010, ore 15:37
Ciao, ho una domanda, tutto ok per la sintassi, ma come faccio a verificare se il dominio esista veramente? Ossai essere sicuro che al di là di quell'indirizzo c'è effettivamente un utente reale e non un "questononesiste@ahahha.com" ?
3 Gianni Tomasicchio Gianni Tomasicchio sabato 2 ottobre 2010, ore 06:01
@mattia

Un modo infallibile al 100% non esiste, nel senso che a voler indagare troppo sulla reale esistenza di un indirizzo email si rischia di ottenere dei falsi positivi o negativi.

Infatti è possibile in prima battuta interrogare un server DNS per verificare al dominio della email è associato un mail server. Ma questa verifica è ovviamente troppo generica.

Allora si potrebbe contattare il server SMTP ma anche in questo caso, in funzione della configurazione del server, si potrebbero ricevere risposte non attendibili.

Per queste ragioni generalmente non ci si spinge oltre il controllo formale dell'indirizzo email, al più si procede all'invio di una mail di prova con un link di attivazione che assicura anche che l'utente è il reale possessore della email inviata.

Infatti nel 99% dei casi non è importante sapere se l'indirizzo email esiste realmente ma è necessario scoprire se l'utente è il reale possessore della email.
4 Federico Federico mercoledž 23 marzo 2011, ore 18:57
Ciao, ottima guida, io ho implementato qualcosa del genere però vorrei creare una blacklist per evitare che gli utenti si registrino con email temporanee. Quindi inserire piano piano in blacklist tutti i domini che offrono questo servizio. Cosi dovrei riuscire a limitare il problema. Come è possibile da php controllare il dominio della mail inserita?Cioè non parlo a livello di interrogare il db quello nessun problema ma come controllo?Effettuo un controllo su tutto quello che è stato inserito dopo la @ e se è nel db allora fornisci un errore?E' bypassabile questo tipo di controllo??
5 Gianni Tomasicchio Gianni Tomasicchio mercoledž 23 marzo 2011, ore 22:48
Un semplice controllo sul dominio potrebbe essere troppo restrittivo, rischieresti di scartare degli indirizzi email "buoni".
6 Marco Grazia domenica 28 ottobre 2012, ore 11:06
Rischieresti in breve di ritrovarti un immenso (e inutile) database di indirizzi che nessuno usa (un fake o un flamer userà per pochissimo tempo l'email e poi ne creerà altre, magari con altri domini).
La strada migliore è monitorare l'IP e inviare dei cookie da ricontrollare ogni volta che un utente fa il login o si iscrive, in quest'ultimo caso se l'IP è lo stesso di un altro registrato (ma dietro ci può essere una LAN) e/o c'è il cookie allora il tipo sta semplicemente riscrivendosi dietro altro nick.
7 Simi857 sabato 29 ottobre 2016, ore 11:00
Io ho sempre utilizzato le api di un servizio esterno. E' più comodo in quanto pensano sempre a loro a mantenere aggiornati gli script delle verifiche. http://www.verificaemail.com/verifica-email In questo caso viene anche contattato il relativo server per verificare l'email
Effettua l'accesso o registrati per inserire un commento