การตรวจสอบอีเมล (Validate email address)
Posted by
Patrickz
,
18 January 2010
·
2707 views
การตรวจสอบอีเมล Address
มีขั้นตอนดังนี้
1. email address format
เอกสารข้อกำหนดของอีเมลมีหลายรุ่น เช่น RFC 822 (1982), RFC 2822 (2001), RFC 5322 (2008) ดังนั้นรูปแบบอีเมลหนึ่ง จึงอาจไม่เข้าเงื่อนไขตามเอกสารข้อกำหนดบางชุดก็ได้ ดังนั้นจึงควรยึดถือตาม RFC 2822 เป็นอย่างต่ำ
รูปแบบอีกเมล local-part@hostname.com ประกอบไปด้วย 2 ส่วน คั่นด้วยเครื่องหมาย @
ส่วนแรก (อยู่หน้าเครื่องหมาย @) เรียกว่า local-part มีความยาวไม่เกิน 64 ตัวอักษร
ส่วนหลัง (อยู่หลังเครื่องหมาย @) เรียกว่า hostname มีความยาวไม่เกิน 255 ตัวอักษร
รูปแบบอีเมลประกอบไปด้วย:
2. DNS validate
คือขั้นตอนการเข้าไปดู MX record ของ Domain นั้นๆ เพื่อตรวจสอบดูว่า domain นั้นสามารถรับอีเมลได้หรือไ่ม่
หากไม่เจอ MX Record ก็หมายความว่า อีเมลนั้นไม่มีตัวตน เนื่องจาก domain นั้นๆ ไม่สามารถรับอีเมลได้
การตรวจสอบ MX Record นั้น สามารถทำได้โดยการติดต่อไปยัง DNS ด้วยคำสั่ง dig, nslookup
ตัวอย่างคำสั่ง $dig MX gmail.com
อีกตัวอย่างจากบริการจาก mxtoolbox.com เพื่อดู MX Record ของ gmail.com
สำหรับ ภาษา PHP มี function getmxrr() ให้ใช้อยู่แล้ว
3. SMTP (Callback_verification, VRFY)
ตอนนี้เราทราบแล้วว่า อีเมล์ถูกรูปแบบ และ domain ก็รับอีเมลได้ แต่ยังไม่รู้ว่าที่อยู่อีเมลนั้นมีอยู่จริงหรือไม่ ดังนั้นสิ่งที่ต้องตรวจสอบต่อไปคือ
การถาม mail server ว่า มี mailbox (อีเมล) นี้มีอยู่จริงหรือเปล่า
การติดต่อทำได้โดยการเปิด socket ติดต่อไปยัง SMTP ซึ่งโดยปกติ จะเป็น port 25
เรื่องนี้เกี่ยวข้องกับ protocal ตรงๆ จึงไม่ขออธิบาย แต่สรุปว่าโดยทั่วไป มี 2 คำสั่ง
- vrfy (verify) ใช้ถาม mail server ว่ามี mailbox หรือไม่ ทำงานได้เร็วกว่าคำสั่ง rcpt(จะอธิบายต่อไป) แต่อาจใช้ไม่ได้ เนื่องจากอาจมีนโยบายด้านความปลอดภัย
ตัวอย่าง
แสดงว่า mike@abc.com มีอยู่จริง
แล้วถ้าไปดึง mailing-list ล่ะ
เริ่มน่ากลัวล่ะ...เหตุผลที่คำสั่งนี้มักใช้ไม่ได้
- rcpt เป็นคำสั่งกำหนด mailbox ที่จะส่งเมล (แ่ต่เราจะไม่ส่งจริง แค่ถามเฉยๆ) ลองดูตัวอย่างจาก บทความ How to check if an email address exists without sending an email?
ดังนั้น หาก mailbox นี้มีอยู่จริง mail server จะคืนค่า 250 กลับมาให้
คุณ Gabe ได้เขียน SMTP_validateEmail class (PHP) แจกจ่าย ผมยังไม่ได้ลอง (ถ้าลองแล้วไม่ work จะ update และแก้ไขให้)
สรุป
1. email address format - ตรวจสอบรูปแบบอีเมล
2. DNS validate - ถาม domain ว่ารับเมลได้ไหม
3. SMTP (Callback_verification, VRFY) ถาม mail server ว่า มี email address นี้อยู่จริงหรือไม่
Links
มีขั้นตอนดังนี้
1. email address format
เอกสารข้อกำหนดของอีเมลมีหลายรุ่น เช่น RFC 822 (1982), RFC 2822 (2001), RFC 5322 (2008) ดังนั้นรูปแบบอีเมลหนึ่ง จึงอาจไม่เข้าเงื่อนไขตามเอกสารข้อกำหนดบางชุดก็ได้ ดังนั้นจึงควรยึดถือตาม RFC 2822 เป็นอย่างต่ำ
รูปแบบอีกเมล local-part@hostname.com ประกอบไปด้วย 2 ส่วน คั่นด้วยเครื่องหมาย @
ส่วนแรก (อยู่หน้าเครื่องหมาย @) เรียกว่า local-part มีความยาวไม่เกิน 64 ตัวอักษร
ส่วนหลัง (อยู่หลังเครื่องหมาย @) เรียกว่า hostname มีความยาวไม่เกิน 255 ตัวอักษร
รูปแบบอีเมลประกอบไปด้วย:
- ตัวอักษร a-z, A-Z
- ตัวเลข 0-9
- อักขระ ! # {:content:} % & ' * + - / = ? ^ _ ` { | } ~
- อักขระ . ต้องไม่ใช่ตัวแรก หรือตัวสุดท้าย และต้องไม่ใช้ติดกัน
- domain name ต้องไม่เกิน 255 ตัวอักษร
<?php
$pattern = "/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i";
$email = 'myemail@gmail.com';
if (preg_match($pattern, $email)) {
echo "A match was found.";
} else {
echo "A match was not found.";
}
?>
2. DNS validate
คือขั้นตอนการเข้าไปดู MX record ของ Domain นั้นๆ เพื่อตรวจสอบดูว่า domain นั้นสามารถรับอีเมลได้หรือไ่ม่
หากไม่เจอ MX Record ก็หมายความว่า อีเมลนั้นไม่มีตัวตน เนื่องจาก domain นั้นๆ ไม่สามารถรับอีเมลได้
การตรวจสอบ MX Record นั้น สามารถทำได้โดยการติดต่อไปยัง DNS ด้วยคำสั่ง dig, nslookup
ตัวอย่างคำสั่ง $dig MX gmail.com
; <<>> DiG 9.2.4 <<>> MX gmail.com ;; global options: printcmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 7644 ;; flags: qr rd ra; QUERY: 1, ANSWER: 5, AUTHORITY: 0, ADDITIONAL: 0 ;; QUESTION SECTION: ;gmail.com. IN MX ;; ANSWER SECTION: gmail.com. 2700 IN MX 5 gmail-smtp-in.l.google.com. gmail.com. 2700 IN MX 20 alt2.gmail-smtp-in.l.google.com. gmail.com. 2700 IN MX 30 alt3.gmail-smtp-in.l.google.com. gmail.com. 2700 IN MX 40 alt4.gmail-smtp-in.l.google.com. gmail.com. 2700 IN MX 10 alt1.gmail-smtp-in.l.google.com.จะเห็นว่า domain gmail.com มี mail server รองรับ 5 domain (แต่ล่ะ domain อาจจะมี server วิ่งอยู่กี่ร้อยกี่พันตัว ก็มิอาจรู้ได้)
อีกตัวอย่างจากบริการจาก mxtoolbox.com เพื่อดู MX Record ของ gmail.com
สำหรับ ภาษา PHP มี function getmxrr() ให้ใช้อยู่แล้ว
3. SMTP (Callback_verification, VRFY)
ตอนนี้เราทราบแล้วว่า อีเมล์ถูกรูปแบบ และ domain ก็รับอีเมลได้ แต่ยังไม่รู้ว่าที่อยู่อีเมลนั้นมีอยู่จริงหรือไม่ ดังนั้นสิ่งที่ต้องตรวจสอบต่อไปคือ
การถาม mail server ว่า มี mailbox (อีเมล) นี้มีอยู่จริงหรือเปล่า
การติดต่อทำได้โดยการเปิด socket ติดต่อไปยัง SMTP ซึ่งโดยปกติ จะเป็น port 25
เรื่องนี้เกี่ยวข้องกับ protocal ตรงๆ จึงไม่ขออธิบาย แต่สรุปว่าโดยทั่วไป มี 2 คำสั่ง
- vrfy (verify) ใช้ถาม mail server ว่ามี mailbox หรือไม่ ทำงานได้เร็วกว่าคำสั่ง rcpt(จะอธิบายต่อไป) แต่อาจใช้ไม่ได้ เนื่องจากอาจมีนโยบายด้านความปลอดภัย
ตัวอย่าง
Quote
SMTP client: VRFY mike
SMTP server: 250 mike@abc.com
SMTP server: 250 mike@abc.com
แล้วถ้าไปดึง mailing-list ล่ะ
Quote
SMTP client: VRFY users-hackers
SMTP server: 250-carol@abc.com
250-greg@abc.com
250-marsha@abc.com
250 peter@abc.com
SMTP server: 250-carol@abc.com
250-greg@abc.com
250-marsha@abc.com
250 peter@abc.com
- rcpt เป็นคำสั่งกำหนด mailbox ที่จะส่งเมล (แ่ต่เราจะไม่ส่งจริง แค่ถามเฉยๆ) ลองดูตัวอย่างจาก บทความ How to check if an email address exists without sending an email?
Quote
COMMAND:
telnet mail.reddit.com 25
COMMAND:
helo hi
RESPONSE:
250 mail.reddit.com
COMMAND:
mail from: youremail@gmail.com
RESPONSE:
250 2.1.0 Ok
COMMAND:
rcpt to: mailbox.does.not.exist@reddit.com
RESPONSE:
550 5.1.1 <mailbox.does.not.exist@reddit.com>: Recipient address rejected: User unknown in local recipient table
COMMAND:
quit
RESPONSE:
221 2.0.0 Bye
telnet mail.reddit.com 25
COMMAND:
helo hi
RESPONSE:
250 mail.reddit.com
COMMAND:
mail from: youremail@gmail.com
RESPONSE:
250 2.1.0 Ok
COMMAND:
rcpt to: mailbox.does.not.exist@reddit.com
RESPONSE:
550 5.1.1 <mailbox.does.not.exist@reddit.com>: Recipient address rejected: User unknown in local recipient table
COMMAND:
quit
RESPONSE:
221 2.0.0 Bye
ดังนั้น หาก mailbox นี้มีอยู่จริง mail server จะคืนค่า 250 กลับมาให้
คุณ Gabe ได้เขียน SMTP_validateEmail class (PHP) แจกจ่าย ผมยังไม่ได้ลอง (ถ้าลองแล้วไม่ work จะ update และแก้ไขให้)
สรุป
1. email address format - ตรวจสอบรูปแบบอีเมล
2. DNS validate - ถาม domain ว่ารับเมลได้ไหม
3. SMTP (Callback_verification, VRFY) ถาม mail server ว่า มี email address นี้อยู่จริงหรือไม่
Links
- Validate email addresses
- How to check if an email address exists without sending an email?
- check if email address is correct without sending email?
- software: Advanced E-mail Verifier
- software: Email Validation Tools
- SMTP: Validating the sender domain
- SMTP: Spam Filtering for Mail Exchanger
- C#: Effective Email Address Validation
- PHP: SMTP Email Validation (docs)










