Perché la convalida del modulo HTML5 consente le e-mail senza punto?


112

Sto scrivendo un modello molto semplice per dimostrare la convalida di un modulo HTML5. Tuttavia, ho notato che la convalida dell'email non verifica la presenza di un punto nell'indirizzo, né verifica la presenza di caratteri dopo tale punto.

In altre parole, "john @ doe" è considerato valido, quando chiaramente non è un indirizzo email valido; "doe" non è un dominio.

Ecco come codifico il mio campo email:

<input type="email" required />

Non è abbastanza?

Controlla questo violino per vedere cosa intendo.

Nota: so invece come farlo tramite un pattern RegEx. Mi chiedo solo come qualcuno potrebbe farla franca usando invece il tipo di email.


10
In other words, "john@doe" is considered valid, when it's clearly not a valid email address; doe isn't a domain.Sì, doepuò sicuramente essere un dominio (pensa localhost) e quell'indirizzo è tecnicamente valido secondo le specifiche.
ammesso il

2
@admdrew Heh ... sarebbe un caso interessante, se invii un'e-mail dal server di posta stesso e decidi di scrivere "friend @ localhost"
Katana314

@ Katana314 - eh, sì. La maggior parte dei server di posta (ben configurati) rifiuterà i messaggi inviati a indirizzi che non corrispondono a un dominio previsto, quindi in generale non c'è un problema con gli localhostindirizzi.
ammesso il

Risposte:


83

Perché a @ b è un indirizzo email valido (ad es. Localhost è un dominio valido). Vedi http://en.wikipedia.org/wiki/Email_address#Examples

Inoltre, tieni presente che dovresti sempre eseguire la convalida dell'input nel server. La convalida lato client dovrebbe essere solo per fornire feedback all'utente e non essere affidabile, poiché può essere facilmente aggirata.


7
Grazie. Non vedo come nessuna azienda possa trarre vantaggio da questa convalida e-mail immediata. Facebook non permetterebbe a qualcuno di registrarsi con un indirizzo a @ b. Grazie per le informazioni però. (Non ho sottovalutato la tua risposta)
WEFX

6
In caso di siti web come Facebook con accesso pubblico non è di alcuna utilità. Ma pensa ai siti web interni. Potresti scrivere a joe @ support. Ma penso anche che sia di minima utilità. Tuttavia, i browser web devono essere implementati in base a standard (cioè RFC), non basati sui casi più comuni.
Ali Alavi

9
Mi chiedo quando sia stata l'ultima volta che qualcuno ha effettivamente inviato un'e-mail a localhost!
Matthew Lock

2
Come sidenote uno dei più brevi indirizzi e-mail di lavoro ( recordsetter.com/world-record/shortest-email-address/4327 ) èau@ua
Kyborek

132

In teoria puoi avere un indirizzo senza "." nel.

Dal momento che tecnicamente cose come:

user@com
user@localserver
user@[IPv6:2001:db8::1]

Sono tutte email valide.

Quindi la convalida HTML5 standard consente tutte le e-mail valide, comprese quelle non comuni.

Per alcune spiegazioni di facile lettura (invece di leggere gli standard): http://en.wikipedia.org/wiki/Email_address#Examples


1
D'accordo, questo risponde al "perché", non alla "soluzione". Ero anche curioso del perché. Ora so di non "aggiustare".
Eleanor Zimmermann

Un esempio del primo tipo è il dominio uz, che punta direttamente a un IP a partire da ottobre 2018. Se fai un nslookup uz, punta a 91.212.89.8, quindi dovrebbe essere possibile avere la posta elettronica anche su questo dominio.
PulseJet

36

Prova ad aggiungerlo all'input

pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,63}$"

Violino


2
Con molti nuovi domini disponibili, ad esempio (contabili [11], internazionali [13] ecc.) E una lunghezza massima potenziale di 63, il valore della lunghezza del pattern regex dovrebbe essere {2, 63}.
unasAquila

42
-1. In primo luogo, non hai nemmeno provato a spiegare cosa questo consente o limita, né perché qualcuno vorrebbe quelle regole. In secondo luogo, è molto più restrittivo di quanto consentito dagli standard (non pretendo di aver letto e diffamato gli standard, ma vedi, ad esempio, en.wikipedia.org/wiki/Email_address#Internationalization o le numerose domande di convalida delle email su Stack Overflow per esempi di indirizzi email strani). Perché lo fai? Se qualcuno sta inserendo qualcosa di insolito come e-mail, accettalo: è probabile che lo sappia meglio di te.
Mark Amery

7
In realtà, direi che "è probabile" che stiano commettendo un errore. È / può / essere che hanno un indirizzo e-mail molto insolito, ma direi che la maggior parte delle volte si otterrebbe semplicemente un indirizzo e-mail corretto al posto di uno errato se si dovesse interrompere la convalida e richiedere il utente da controllare.
Geoff Kendall

1
Dovrebbe avere un ^, a indicare che dovrebbe iniziare a corrispondere dall'inizio della stringa e accettare anche le maiuscole:^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]+$
Kohjah Breese

13

L' RFC 822 , capitolo 6, fornisce la specifica di un indirizzo in formato Backus-Naur aumentato (BNF):

addr-spec   =  local-part "@" domain
local-part  =  word *("." word)
domain      =  sub-domain *("." sub-domain)

L'utilizzo di questa specifica a@bè un indirizzo valido.

AGGIORNARE

Per rispondere al commento di Trejkaz, aggiungo le seguenti definizioni. Vediamo che lo SPAZIO è consentito ma solo tra virgolette.

word          =  atom / quoted-string
atom          =  1*<any CHAR except specials, SPACE and CTLs>
quoted-string = <"> *(qtext/quoted-pair) <">
SPACE         =  <ASCII SP, space>
CTL           =  <any ASCII control character and DEL> 
qtext         =  <any CHAR excepting <">, "\" & CR, and including linear-white-space>
quoted-pair   =  "\" CHAR  

OTOH, RFC 822 mi consente anche di inserire spazi nella parte locale, cosa che Chrome almeno non sembra consentire, quindi non sono sicuro che utilizzino la RFC come riferimento. (Anche se dovrebbero esserlo!)
Trejkaz

8

In questa pagina MDN mostra che i browser regex dovrebbero utilizzare per convalidare l'email:

https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/email#Validation

Puoi modificare leggermente questa regex per richiedere almeno un punto nel nome del dominio: cambia la stella *alla fine della regex in un più +. Quindi usa quella regex come patternattributo:

<input type="email" pattern="^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+$"></input>

3

Puoi personalizzare lo schema del campo email:

input:valid {
  border-color: green
}

input:invalid {
  border-color: red
}
Email:
<input type="email" required value="a@b.c" /><br>

Non-dots Email:
<input type="email" required pattern="[^.]+@[^.]+" value="a@b.c" />


2

Ecco come puoi farlo con html5 usando il pattern regex. Puoi anche includere un messaggio personalizzato da visualizzare.

<form>
  <input type="email" value="paul@test" required pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,63}$" title="Hey, you are missing domain part in the email !!!"/>
  <button type="submit">Click Me</button>
</form>


-5

Questo modello funziona sempre per me.

Il testo deve essere in minuscolo pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}$"ma penso che copra più o meno la maggior parte delle email.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.