Viết hàm hoặc chương trình để xác thực địa chỉ e-mail theo RFC 5321 (một số quy tắc ngữ pháp được tìm thấy trong 5322 ) với sự thư giãn mà bạn có thể bỏ qua nhận xét và gấp khoảng trắng ( CFWS
) và chữ địa chỉ chung. Điều này mang lại ngữ pháp
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
Lưu ý: Tôi đã bỏ qua định nghĩa IPv6-addr
vì RFC cụ thể này bị sai và không cho phép, ví dụ ::1
. Thông số kỹ thuật chính xác là trong RFC 2373 .
Những hạn chế
Bạn không thể sử dụng bất kỳ cuộc gọi thư viện xác nhận e-mail hiện có. Tuy nhiên, bạn có thể sử dụng các thư viện mạng hiện có để kiểm tra địa chỉ IP.
Nếu bạn viết một hàm / phương thức / toán tử / tương đương, nó sẽ lấy một chuỗi và trả về giá trị boolean hoặc true / falsy, phù hợp với ngôn ngữ của bạn. Nếu bạn viết chương trình, nó sẽ lấy một dòng từ stdin và cho biết hợp lệ hoặc không hợp lệ thông qua mã thoát.
Các trường hợp thử nghiệm
Các trường hợp kiểm tra sau đây được liệt kê trong các khối cho gọn. Khối đầu tiên là các trường hợp nên vượt qua:
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
Các trường hợp kiểm tra sau không nên vượt qua:
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
và ?????@domain.com
thất bại?
IPv6-addr
đã không được xác định và có các trường hợp thử nghiệm có địa chỉ ipv6, có cách nào để xác thực chúng không?