เขียนฟังก์ชั่นหรือโปรแกรมเพื่อตรวจสอบที่อยู่อีเมลกับ 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
หากคุณเขียนฟังก์ชัน / method / โอเปอเรเตอร์ / ที่เทียบเท่ากันควรใช้สตริงและส่งคืนค่าบูลีนหรือค่าความจริง / ค่าเท็จตามความเหมาะสมกับภาษาของคุณ หากคุณเขียนโปรแกรมก็ควรจะใช้บรรทัดเดียวจาก 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]
email@d.comและ?????@domain.comล้มเหลว
IPv6-addrไม่ได้ระบุไว้และมีกรณีทดสอบที่มีที่อยู่ ipv6 มีวิธีที่ถูกต้องในการตรวจสอบความถูกต้องหรือไม่