주석을 무시하고 공백 ( ) 및 일반화 된 주소 리터럴을 무시할 수있는 완화 기능을 사용하여 RFC 5321 (일부 문법 규칙 5322 에서 발견됨)에 대해 전자 우편 주소의 유효성을 검증하는 함수 또는 프로그램을 작성하십시오 CFWS
. 이것은 문법을 제공합니다
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
참고 : IPv6-addr
이 특정 RFC가 잘못되어 예를 들어 허용하지 않기 때문에 정의를 건너 뛰었습니다 ::1
. 올바른 사양은 RFC 2373에 있습니다.
제한 사항
기존 이메일 유효성 검사 라이브러리 호출을 사용할 수 없습니다. 그러나 기존 네트워크 라이브러리를 사용하여 IP 주소를 확인할 수 있습니다.
함수 / 메소드 / 연산자 / 동등한 함수를 작성하는 경우 언어에 따라 문자열을 가져 와서 부울 값 또는 진실 / 거짓 값을 반환해야합니다. 프로그램을 작성하는 경우 stdin에서 한 줄을 가져 와서 종료 코드를 통해 유효 또는 무효를 표시해야합니다.
테스트 사례
다음 테스트 사례는 압축을 위해 블록으로 나열됩니다. 첫 번째 블록은 다음과 같은 경우입니다.
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
다음 테스트 사례는 통과하지 않아야합니다.
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]
왜해야
—
grc
email@d.com
하고 ?????@domain.com
실패?
@ardnew, 관련 RFC에 대한 링크를 추가했습니다. 질문이 이미 너무 길어서 인라인하고 싶지 않습니다.
—
피터 테일러
길이 제한도 필요합니까? 각 도메인 레이블의 local-part / 63에 대한 전체 이메일 주소 / 64는 254?
—
MichaelRushton
IPv6-addr
왼쪽을 확인하는 올바른 방법이, 정의되지 않은, 및 IPv6 주소를 가지고 테스트 사례가있다?