Escreva uma função ou programa para validar um endereço de email no RFC 5321 (algumas regras gramaticais encontradas no 5322 ) com o relaxamento que você pode ignorar comentários e dobrar espaços em branco ( CFWS
) e literais de endereço generalizados. Isso fornece a gramática
Mailbox = Local-part "@" ( Domain / address-literal )
Local-part = Dot-string / Quoted-string
Dot-string = Atom *("." Atom)
Atom = 1*atext
atext = ALPHA / DIGIT / ; Printable US-ASCII
"!" / "#" / ; characters not including
"$" / "%" / ; specials. Used for atoms.
"&" / "'" /
"*" / "+" /
"-" / "/" /
"=" / "?" /
"^" / "_" /
"`" / "{" /
"|" / "}" /
"~"
Quoted-string = DQUOTE *QcontentSMTP DQUOTE
QcontentSMTP = qtextSMTP / quoted-pairSMTP
qtextSMTP = %d32-33 / %d35-91 / %d93-126
quoted-pairSMTP = %d92 %d32-126
Domain = sub-domain *("." sub-domain)
sub-domain = Let-dig [Ldh-str]
Let-dig = ALPHA / DIGIT
Ldh-str = *( ALPHA / DIGIT / "-" ) Let-dig
address-literal = "[" ( IPv4-address-literal / IPv6-address-literal ) "]"
IPv4-address-literal = Snum 3("." Snum)
IPv6-address-literal = "IPv6:" IPv6-addr
Snum = 1*3DIGIT
; representing a decimal integer value in the range 0 through 255
Nota: Eu pulei a definição de IPv6-addr
porque esta RFC específica erra e desaprova, por exemplo ::1
. A especificação correta está na RFC 2373 .
Restrições
Você não pode usar nenhuma chamada existente da biblioteca de validação de email. No entanto, você pode usar as bibliotecas de rede existentes para verificar os endereços IP.
Se você escrever uma função / método / operador / equivalente, ela deve pegar uma string e retornar um valor booleano ou verdade / falso, conforme apropriado para o seu idioma. Se você escrever um programa, ele deve usar uma única linha do stdin e indicar válido ou inválido através do código de saída.
Casos de teste
Os seguintes casos de teste estão listados em blocos para compactação. O primeiro bloco são casos que devem passar:
email@domain.com
e@domain.com
firstname.lastname@domain.com
email@subdomain.domain.com
firstname+lastname@domain.com
email@123.123.123.123
email@[123.123.123.123]
"email"@domain.com
1234567890@domain.com
email@domain-one.com
_______@domain.com
email@domain.name
email@domain.co.jp
firstname-lastname@domain.com
""@domain.com
"e"@domain.com
"\@"@domain.com
email@domain
"Abc\@def"@example.com
"Fred Bloggs"@example.com
"Joe\\Blow"@example.com
"Abc@def"@example.com
customer/department=shipping@example.com
$A12345@example.com
!def!xyz%abc@example.com
_somename@example.com
_somename@[IPv6:::1]
fred+bloggs@abc.museum
email@d.com
?????@domain.com
Os seguintes casos de teste não devem passar:
plainaddress
#@%^%#$@#$@#.com
@domain.com
Joe Smith <email@domain.com>
email.domain.com
email@domain@domain.com
.email@domain.com
email.@domain.com
email.email.@domain.com
email..email@domain.com
email@domain.com (Joe Smith)
email@-domain.com
email@domain..com
email@[IPv6:127.0.0.1]
email@[127.0.0]
email@[.127.0.0.1]
email@[127.0.0.1.]
email@IPv6:::1]
_somename@domain.com]
email@[256.123.123.123]
email@d.com
e ?????@domain.com
falhar?
IPv6-addr
foi deixado indefinido e há casos de teste com endereços IPv6, existe uma maneira correta de validá-los?