Narisa.com: การตรวจสอบอีเมล (Validate email address) - Narisa.com

Jump to content

Subscribe to Patrickz's Blog        RSS Feed

การตรวจสอบอีเมล (Validate email address)

1 Comments
การตรวจสอบอีเมล 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 ตัวอักษร
รูปแบบอีเมลประกอบไปด้วย:
  • ตัวอักษร a-z, A-Z
  • ตัวเลข 0-9
  • อักขระ ! # {:content:} % & ' * + - / = ? ^ _ ` { | } ~
  • อักขระ . ต้องไม่ใช่ตัวแรก หรือตัวสุดท้าย และต้องไม่ใช้ติดกัน
  • domain name ต้องไม่เกิน 255 ตัวอักษร

ตัวอย่าง Regular Expression สำหรับ email address อย่างง่าย : /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i

<?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

แสดงว่า 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

เริ่มน่ากลัวล่ะ...เหตุผลที่คำสั่งนี้มักใช้ไม่ได้ :D

- 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


ดังนั้น หาก 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 Comments On This Entry

Page 1 of 1

Jotoe 

22 January 2010 - 02:40 AM
ขอบคุณครับ สำหรับเทคนิคดีๆ ที่มีมาฝากเป็นประจำ จะติดตามต่อไปครับ
0
Page 1 of 1

September 2010

S M T W T F S
   12 3 4
567891011
12131415161718
19202122232425
2627282930  

Search My Blog

Recent Comments

test

test