2010-07-15 11 views
6

Sto codificando un sito in php e attualmente sono nella pagina di contatto e mi chiedevo quale fosse il modo migliore per convalidare un indirizzo email?Metodi di convalida dell'indirizzo email (pulsante Iscriviti)

  1. Inviando un link di convalida alla propria email?
  2. Regex
  3. Qualsiasi altro metodo?

Inoltre, potresti dirmi perché e una guida per raggiungerla? Non voglio che qualcuno faccia il codice per me perché non è divertente per me e non imparo ma solo alcune indicazioni sulle tecniche utilizzate per ottenere i metodi sopra indicati.

Inoltre ho intenzione di utilizzare questi metodi per implementare un pulsante di iscrizione sulla mia pagina web. È questo il modo migliore per farlo? altri metodi dovrei condiscendere?

+1

Eventuali duplicati: http://stackoverflow.com/questions/201323/what-is-the-best-regular-expression-for-validating-email-addresses – Anax

+2

Regex non convaliderà una e-mail, si convaliderà solo che l'input dell'utente assomiglia a un'e-mail. ([email protected] convaliderà) Se è davvero necessario convalidare, è necessario inviare un messaggio di posta elettronica di convalida. – marvin

risposta

16

Io di solito passano attraverso questi passaggi

  1. Regex
  2. Manda un codice di attivazione per l'e-mail

se il primo passaggio non riesce non raggiunge mai secondo passo. se l'e-mail di invio non è riuscito perché l'e-mail non esiste a cancellare l'account o fare qualche altra roba

--edit

3 - Se per qualche motivo l'email di attivazione non viene inviato, e-mail doesn viene cancellato, rimane non approvato per 7 giorni (o come configurato dall'utente), il reinvio della posta viene provato ogni 2-3 ore, dopo quei giorni in caso di esito negativo, l'e-mail viene cancellata

4 - Se l'e-mail è stata inviata correttamente ma non attivato rimane non approvato ma può essere riattivato in qualsiasi momento generando un nuovo codice di attivazione

+0

Vorrei anche aggiungere che, per comodità dell'utente, assegnare all'utente non convalidato una sorta di stato "pre-approvato" in modo che quando la consegna della posta sia lenta, l'utente possa comunque utilizzare i propri servizi. E inoltre, non essere troppo rigido nella tua espressione regolare, ma assicurati che sia un po 'come un indirizzo email, non vuoi troppi falsi negativi. –

+0

@Dennis: Non penso che l'inserimento di un indirizzo email plausibile ma potenzialmente falso sia un motivo sufficiente per fornire all'utente ulteriori possibilità di accesso. –

+0

per favore non usare una regex per convalidare un indirizzo email. non è possibile scrivere un'espressione regolare che corrisponda esattamente alla specifica da RFC2822. finirai con entrambi i falsi positivi e i falsi negativi. i falsi negativi sono un grosso problema perché proibiscono l'accesso a indirizzi email validi. Jeffrey Friedl ha sviluppato un'e-mail che corrisponde alla regex in "Gestione delle espressioni regolari". Era qualcosa come 7000 caratteri e corrispondeva al 98% dei formati di indirizzi validi. È meglio usare solo una libreria che usa questo. – bluesmoon

3

Dipende se l'utente desidera effettivamente ricevere una risposta o meno.

Se l'utente fa una domanda, vorrà una risposta e probabilmente darà il suo indirizzo e-mail valido. In questo caso, utilizzerei un controllo regex molto lento per individuare errori di battitura o un indirizzo mancante. (Qualcosa come [email protected]+.)

Se l'utente non desidera essere contattato, ma si desidera conoscere il loro indirizzo, è necessario lavorare con un link di convalida. Non c'è altro modo per garantire che l'indirizzo e-mail sia valido e appartenga all'utente.

11

credo che la cosa migliore è una combinazione di 3 e 1.

In una prima fase di verificare sintatticamente l'e-mail (per la cattura di errori di battitura):

filter_var($email, FILTER_VALIDATE_EMAIL) 

E in un secondo si invia una e-mail con un indirizzo di conferma (sia per errori di cattura e informazioni volutamente sbagliate).

+5

+1 Le persone devono sapere di 'filter_var()', è fantastico. – BoltClock

-1
function checkEmail($email) { 
    if(preg_match("/^([a-zA-Z0-9])+([a-zA-Z0-9\._-]) 
    ↪*@([a-zA-Z0-9_-])+([a-zA-Z0-9\._-]+)+$/", 
       $email)){ 
    list($username,$domain)=split('@',$email); 
    if(!checkdnsrr($domain,'MX')) { 
     return false; 
    } 
    return true; 
    } 
    return false; 
+1

La tua espressione regolare rifiuta molti indirizzi email validi. Ad esempio *@esempio.com, "Ciao mondo" @ example.com, qualcuno @ [127.0.0.1], qualcuno @ [2001: 1234: 1234 :: 1.2.3.4] – jcoder

+0

Mentre ti lascio andare con l'ipv6 disallineamento, il resto della regex è semplicemente troppo povero da considerare. – symcbean

3

L'unico modo per sapere veramente se un'e-mail è valida o meno è inviare un'e-mail ad esso. Se proprio devi, usa uno dei these.Technically, non è necessario alcun periodo dopo @ per i domini locali. Tutto ciò che è necessario è un dominio segue @.

+2

Attendi fino a quando le persone non inizieranno a inserire i valori delimitati da colon IPV6 come dominio. :-) –

1

Dipende dal tuo obiettivo. Se è necessario disporre di un'e-mail valida e attiva, è necessario inviare un'e-mail che richiede la verifica della ricezione. In questo caso, non sono necessarie convalide regex se non per comodità dell'utente.

Ma se il tuo desiderio è di aiutare l'utente a evitare errori di battitura riducendo al minimo il fastidio dell'utente, convalidare con regex.

2

Una regex non è realmente adatta per determinare la validità della sintassi dell'indirizzo di posta elettronica e l'opzione FILTER_VALIDATE_EMAIL per la funzione filter_var è piuttosto inaffidabile. Io uso il EmailAddressValidator Class per testare la sintassi degli indirizzi e-mail.

Ho messo insieme alcuni esempi di risultati errati restituiti da filter_var (versione PHP 5.3.2-1ubuntu4.2). Ce ne sono probabilmente di più Alcuni sono certamente un po 'estremi, ma ancora degno di nota:

RFC 1035 2.3.1. Sintassi nome preferito
http://tools.ietf.org/search/rfc1035
Riepilogato come: un dominio è costituito da etichette separate da punti separatori (non necessariamente vero per i domini locali).

echo filter_var('[email protected]', FILTER_VALIDATE_EMAIL); 
// [email protected] 

RFC 1035 2.3.1. Sintassi nome preferito
Le etichette devono seguire le regole per i nomi host ARPANET. Devono iniziare con una lettera, una lettera o una cifra e avere come caratteri interni solo lettere, cifre e trattini.

echo filter_var('[email protected]', FILTER_VALIDATE_EMAIL); 
// [email protected] 

RFC 2822 3.2.5. stringhe tra virgolette
http://tools.ietf.org/html/rfc2822#section-3.2.5
Questo è valido (anche se è respinta da molti server di posta):

echo filter_var('name"quoted"[email protected]', FILTER_VALIDATE_EMAIL); 
// FALSE 

RFC 5321 4.5.3.1.1. Parte locale
http://tools.ietf.org/html/rfc5321#section-4.5.3.1.1
La lunghezza totale massima di un nome utente o altra parte locale è 64 ottetti.
di prova con 70 caratteri:

echo filter_var('Abcdefg[email protected]example.com', FILTER_VALIDATE_EMAIL); 
// Abcdefg[email protected]example.com 

RFC 5321 4.5.3.1.2. Dominio
http://tools.ietf.org/html/rfc5321#section-4.5.3.1.2
La lunghezza massima totale di un nome di dominio o di un numero è 255 ottetti.
di prova con 260 caratteri:

echo filter_var('[email protected]jAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghij.com', FILTER_VALIDATE_EMAIL); 
// [email protected]jAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghij.com 

Date un'occhiata al Validate an E-Mail Address with PHP, the Right Way per ulteriori informazioni.

+1

L'articolo di Doug Lovell da Linux Journal è errato in molti casi. Ripete gli errori originali in RFC 3696 che sono stati corretti nell'errata. Sfortunatamente Linux Journal non ha ritenuto opportuno correggere questo articolo fuorviante e viene ancora citato come un'autorità. –

2

Prima di inviare un messaggio di posta elettronica di convalida, è possibile utilizzare anche checkdnsrr() per verificare che il dominio esista e abbia impostato i record MX. Questo rileverà le email che usano domini fasulli (come [email protected]).

function validateEmail($email, $field, $msg = '') 
{ 
    if (!filter_var($email, FILTER_VALIDATE_EMAIL)) 
    { 
     return false; 
    } 
    list($user, $domain) = explode('@', $email); 
    if (function_exists('checkdnsrr') && !checkdnsrr($domain, 'MX')) 
    { 
     return false; 
    } 
    return true; 
} 

Abbiamo bisogno di utilizzare function_exists() per verificare checkdnsrr() è disponibile per noi perché non era disponibile su Windows prima di PHP 5.3.

+1

Perché pensi che i record MX siano necessari per la consegna dell'e-mail? "Se non erano presenti record MX, il server ritorna a A, vale a dire, effettua una richiesta per il record A dello stesso dominio." – sanmai

+0

@sanmai Sebbene ciò possa essere vero in teoria, raramente, se non mai, lo si vede accadere nella pratica. Inoltre, quando si tratta di convalidare l'indirizzo e-mail, ad eccezione dell'invio di una e-mail all'indirizzo e in attesa di una risposta, nessun processo automatico sarà perfetto. Questo metodo incluso. Tuttavia, se vengono forniti indirizzi di posta elettronica sbagliati, ciò contribuirà a mitigarli. –

+0

@ john-conde Ho visto accadere questo almeno un paio di volte. Immagina di descrivere un manager perché il tuo prezioso cliente non può registrarsi utilizzando il suo indirizzo di posta elettronica funzionante (hanno controllato). – sanmai

4

Il modo migliore per farlo è inviare un'email con un link di convalida. Per lo meno se non si desidera ricevere e-mail di attivazione, convalidare l'indirizzo e-mail. La migliore funzione di convalida della posta elettronica è RFC-compliant email address validator by Dominic Sayers.

includere semplicemente il file php nel progetto e usare in questo modo:

if (is_email($email, $checkDNS, $diagnose)) //$checkDNS and $diagnose are false by default 
    echo 'Email valid'; 
else 
    echo 'Email invalid'; 
  • Se $ checkDNS è impostato su true, sarà verificare che esiste il dominio. Se il dominio non esiste la funzione restituisce false anche se l'e-mail è valida.
  • Se $ diagnose è impostato su true, la funzione restituisce un codice anziché un valore booleano che ti dirà perché l'email non è valida (o 0 se valida).
0

Alcune buone risposte qui, e sono d'accordo con il prescelto ad eccezione del bit regex. Come altre persone hanno sottolineato è difficile, se non impossibile, trovare una regex che implementa pienamente tutte le peculiarità di RFC 5321.

Siete invitati a utilizzare la mia funzione PHP gratuita is_email() per convalidare gli indirizzi. È disponibile here.

Garantirà che un indirizzo sia completamente conforme a RFC 5321. Può anche verificare anche se il dominio esiste realmente.

Non si deve fare affidamento su un validatore per dirti se l'indirizzo di posta elettronica di un utente esiste effettivamente: alcuni ISP forniscono indirizzi non conformi ai propri utenti, in particolare in paesi che non utilizzano l'alfabeto latino. Altro nel mio saggio sulla convalida dell'email qui: http://isemail.info/about.

Problemi correlati