Por que a validação de formulário HTML5 permite e-mails sem um ponto?

113

Estou escrevendo um mock-up muito simples para demonstrar alguma validação de formulário HTML5. No entanto, notei que a validação do e-mail não verifica se há um ponto no endereço, nem verifica os caracteres após o ponto.

Em outras palavras, "john @ doe" é considerado válido quando claramente não é um endereço de e-mail válido; "doe" não é um domínio.

É assim que estou codificando meu campo de e-mail:

<input type="email" required />

Isso não é o suficiente?

Verifique este violino para ver o que quero dizer.

Observação: eu sei como fazer isso por meio de um padrão RegEx. Só estou me perguntando como alguém poderia se safar usando o tipo de e-mail.

WEFX
fonte
10
In other words, "john@doe" is considered valid, when it's clearly not a valid email address; doe isn't a domain.Sim, doedefinitivamente pode ser um domínio (pense localhost) e esse endereço é tecnicamente válido de acordo com as especificações.
Admdrew em
2
@admdrew Heh ... seria um caso interessante, se você estiver enviando um e-mail do próprio servidor de e-mail e decidir escrever "amigo @ localhost"
Katana314
@ Katana314 - heh, sim. A maioria dos servidores de e-mail (bem configurados) rejeitará mensagens enviadas para endereços que não correspondem a um domínio esperado, portanto, de modo geral, não há problemas com os localhostendereços.
Admdrew em

Respostas:

84

Porque a @ b é um endereço de e-mail válido (por exemplo, localhost é um domínio válido). Consulte http://en.wikipedia.org/wiki/Email_address#Examples

Além disso, lembre-se de que você deve sempre fazer a validação da entrada no servidor. A validação do lado do cliente deve ser apenas para fornecer feedback ao usuário e não ser confiável, uma vez que pode ser facilmente contornada.

Ali Alavi
fonte
7
Obrigado. Simplesmente não vejo como qualquer empresa poderia se beneficiar desta validação de e-mail pronta para uso. O Facebook não permite que alguém se inscreva com um endereço a @ b. Obrigado pela informação embora. (Eu não votei contra sua resposta)
WEFX
6
No caso de sites como o Facebook com acesso público, não adianta. Mas pense em sites internos. Você pode escrever para joe @ support. Mas também acho que é de uso mínimo. No entanto, os navegadores da web devem ser implementados com base em padrões (ou seja, RFCs), não com base nos casos mais comuns.
Ali Alavi
9
Eu me pergunto quando foi a última vez que alguém realmente enviou um e-mail para o localhost!
Matthew Lock
2
Como nota pessoal, um dos endereços de e-mail au@ua
ativos
132

Você pode teoricamente ter um endereço sem um "." no.

Já que tecnicamente coisas como:

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

Todos são emails válidos.

Portanto, a validação HTML5 padrão permite todos os e-mails válidos, incluindo os incomuns.

Para obter algumas explicações fáceis de ler (em vez de ler os padrões): http://en.wikipedia.org/wiki/Email_address#Examples

DBS
fonte
1
Concordo, este responde ao 'porquê', não à 'solução'. Eu também estava curioso para saber o porquê. Agora não sei "consertar".
Eleanor Zimmermann
Um exemplo do primeiro tipo é o domínio uz, que aponta diretamente para um IP a partir de outubro de 2018. Se você fizer um nslookup uz, ele aponta para 91.212.89.8, então deve ser possível ter e-mail neste domínio também.
PulseJet
36

Tente adicionar isso à entrada

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

Violino

APAD1
fonte
2
Com muitos novos domínios disponíveis, isto é (contadores [11], internacional [13] etc) e um comprimento máximo potencial de 63, o valor do comprimento do padrão regex deve ser {2, 63}.
unasAquila
42
-1. Em primeiro lugar, você nem tentou explicar o que isso permite ou restringe, nem por que alguém iria querer essas regras. Em segundo lugar, é muito mais restritivo do que os padrões permitem (não vou fingir que li e grocei os padrões, mas veja, por exemplo, en.wikipedia.org/wiki/Email_address#Internationalization ou as muitas perguntas de validação de e-mail no Stack Excesso de exemplos de endereços de e-mail estranhos). Por que fazê-lo? Se alguém estiver inserindo algo incomum como e-mail, apenas aceite - é provável que essa pessoa saiba mais do que você.
Mark Amery
7
Na verdade, eu diria que há "chances" de que eles estejam cometendo um erro. Pode / ser que eles tenham um endereço de e-mail muito incomum, mas eu diria que na maioria das vezes você simplesmente receberia um endereço de e-mail correto no lugar de um incorreto se parasse de passar na validação e avisasse o usuário para verificar.
Geoff Kendall
1
Deve ter um ^, denotando que deve começar a corresponder a partir do início da string e também aceitar maiúsculas:^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]+$
Kohjah Breese
13

O RFC 822 , capítulo 6, fornece a especificação de um endereço na forma aumentada de Backus-Naur (BNF):

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

Usar esta especificação a@bé um endereço válido.

ATUALIZAR

Para responder ao comentário de Trejkaz, adiciono as seguintes definições. Vemos que SPACE são permitidos, mas apenas em strings entre aspas.

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  
Ortomala Lokni
fonte
OTOH, o RFC 822 também me permite colocar espaços na parte local, o que o Chrome, pelo menos, não parece permitir, então não tenho certeza se eles usam o RFC como referência. (Mesmo que devessem ser!)
Trejkaz
8

Nesta página MDN, mostra os navegadores regex que devem usar para validar o e-mail:

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

Você pode alterar ligeiramente esta regex para exigir pelo menos um ponto no nome de domínio: mude a estrela *no final da regex para um sinal de mais +. Em seguida, use essa regex como o patternatributo:

<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>
gitaarik
fonte
3

Você pode personalizar o padrão do campo de e-mail:

input:valid {
  border-color: green
}

input:invalid {
  border-color: red
}
Email:
<input type="email" required value="[email protected]" /><br>

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

Dorian
fonte
2

Aqui está como você pode fazer isso com html5 usando o padrão regex. Você também pode incluir uma mensagem personalizada para exibição.

<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>

Hari Das
fonte
-5

Esse padrão sempre funciona para mim.

O texto deve estar em minúsculas, pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,}$"mas acho que cobre mais ou menos a maioria dos e-mails.

TSlegaíte
fonte