姓名:何瑞 ????????? 學(xué)號:17021211237
原文鏈接:http://www.ruanyifeng.com/blog/2017/06/smtp-protocol.html#support
原文作者:阮一峰
【嵌牛導(dǎo)讀】:Email 是最常用的用戶識別手段。開發(fā)者常常需要驗證郵箱的真實性答倡。一般的方法是,注冊時向該郵箱發(fā)出一封驗證郵件盗扒,要求用戶點擊郵件里面的鏈接。但是很多時候(比如要搞郵件營銷時)缀去,拿到的是成千上萬現(xiàn)成的 Email 地址环疼,不可能通過回復(fù)確認(rèn)真實性,這時該怎么辦呢朵耕?答案就是使用SMTP 協(xié)議。本文將介紹如何通過該協(xié)議驗證郵箱的真假淋叶。
【嵌牛鼻子】:Email驗證阎曹、SMTP協(xié)議
【嵌牛提問】:如何驗證Email地址?
【嵌牛正文】
一煞檩、SMTP 協(xié)議簡介
SMTP 是"簡單郵件傳輸協(xié)議"(Simple Mail Transfer Protocol)的縮寫处嫌,基于 TCP 協(xié)議,用來發(fā)送電子郵件斟湃。
只要運行了該協(xié)議的服務(wù)器端(daemon)熏迹,當(dāng)前服務(wù)器就變?yōu)猷]件服務(wù)器,可以接收電子郵件凝赛。
驗證 Email 郵箱的基本思路如下注暗。
1. 找到郵箱所在域名的 SMTP 服務(wù)器
2. 連接該服務(wù)器
3. 詢問有沒有該郵箱
4. 如果服務(wù)器返回 250? 或 251 狀態(tài)碼,郵箱就是真的墓猎;如果返回 5xx(500~599)捆昏,就是假的。
注意毙沾,即使服務(wù)器確認(rèn)郵箱是真的骗卜, 也不代表郵件一定會發(fā)送到該郵箱,更不代表用戶一定會讀到該郵件左胞。
二寇仓、查找域名的 MX 記錄
下面通過一個例子,演示如何驗證 test@gmail.com 這個郵箱烤宙。
首先遍烦,需要查找 gmail.com 的 MX 記錄。它指向真正處理郵件的那臺服務(wù)器门烂。
$ nslookup
>
(實驗在Windows命令行)輸入 nslookup 命令后乳愉,會提示一個大于號兄淫,表示等待用戶進一步輸入。
> set q=mx
> gmail.com
上面代碼中蔓姚,set q=mx 設(shè)定查詢的是 MX 記錄捕虽,第二行輸入要查找的域名,結(jié)果返回了5條 MX 記錄坡脐。
gmail.com????? MX preference = 5, mail exchanger = gmail-smtp-in.l.google.com
gmail.com? ? ? MX preference = 30, mail exchanger = alt3.gmail-smtp-in.l.google.com
gmail.com? ? ? MX preference = 10, mail exchanger = alt1.gmail-smtp-in.l.google.com
gmail.com? ? ? MX preference = 40, mail exchanger = alt4.gmail-smtp-in.l.google.com
gmail.com? ? ? MX preference = 20, mail exchanger = alt2.gmail-smtp-in.l.google.com
gmail.com 是很大的郵件服務(wù)商泄私,所以會有多條記錄,一般的域名只有一條备闲。如果這一步查不到 MX 記錄晌端,該郵箱肯定是假的。
除了自己執(zhí)行 nslookup恬砂,也可以使用線上服務(wù)(1咧纠,2,3)泻骤。更多 DNS 的介紹漆羔,請參考《DNS 原理入門》。
三狱掂、建立TCP連接
知道了郵件服務(wù)器的地址演痒,就可以與它建立TCP連接了。SMTP 協(xié)議的默認(rèn)端口是25趋惨。使用 Telnet 或 Netcat 命令鸟顺,都可以連接該端口。
$ telnet gmail-smtp-in.l.google.com 25
# 或者
$ nc gmail-smtp-in.l.google.com 25
服務(wù)器返回220狀態(tài)碼器虾,就表示連接成功讯嫂。
220 mx.google.com ESMTP f14si7006176pln.607 - gsmtp
接下來,就可以使用 SMTP 協(xié)議的各種命令與郵件服務(wù)器交互了兆沙。
四端姚、HELO命令和EHLO命令
SMTP 協(xié)議規(guī)定,連接成功后挤悉,必須向郵件服務(wù)器提供連接的域名渐裸,也就是郵件將從哪臺服務(wù)器發(fā)來。假定從 mail@example.com 向 test@gmail.com 發(fā)送郵件装悲,這里要提供的域名就是example.com昏鹃。
HELO exampl.com
注意:windows命令行在tcp連接建立成功后輸入交互信息(如:HELO exampl.com)需要一次輸入成功不能修改,否則可能出錯诀诊。
郵件服務(wù)器返回狀態(tài)碼 250洞渤,表示響應(yīng)成功。
250 mx.google.com at your service
不過属瓣,HELO 命令現(xiàn)在比較少用载迄,一般都使用 EHLO 命令讯柔。
EHLO example.com
郵件服務(wù)器收到 EHLO 命令以后,不僅會返回 250 狀態(tài)碼护昧,還會返回自己支持的各種擴展的列表魂迄。
250-mx.google.com at your service, [114.84.160.153]
250-SIZE 157286400
250-8BITMIME
250-STARTTLS
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-CHUNKING
250 SMTPUTF8
五、MAIL FROM 命令
然后惋耙,連接者要使用 MAIL FROM 命令捣炬,向郵件服務(wù)器提供郵件的來源郵箱。
MAIL FROM:<mail@example.com>
上面代碼表示绽榛,連接者將從 mail@example.com 向郵件服務(wù)器發(fā)送郵件湿酸。郵件服務(wù)器返回 250 狀態(tài)碼,表示響應(yīng)成功灭美。
250 2.1.0 OK h10si3194349otb.59 - gsmtp
SMTP 是一個很簡單的協(xié)議推溃,本身沒有規(guī)定如何驗證郵件的來源,也就是說届腐,不驗證郵件是否真的從 mail@example.com 發(fā)來美莫,所以導(dǎo)致了后來垃圾郵件泛濫。為了控制垃圾郵件梯捕,許多郵件服務(wù)器會用自己的方法驗證郵件地址,下面就是其中的一些方法窝撵。
1. example.com 是否有 MX 記錄
2. example.com 是否可以 Ping 通
3. 是否存在 postmaster@example.com 這個郵箱
4. 發(fā)起連接的 IP 地址是否在黑名單之中
5. IP 地址的反向 DNS 解析傀顾,是否指向一個郵件服務(wù)器
六、RCPT TO 命令
最后一步就是使用 RCPT TO 命令碌奉,驗證郵件地址是否存在短曾。
RCPT TO:<test@gmail.com>
郵件服務(wù)器返回了 550 狀態(tài)碼,表示該 Email 地址不存在赐劣。
550-5.1.1 The email account that you tried to reach does not exist.Please try
550-5.1.1 double-checking the recipient's email addressfortypos or
550-5.1.1 unnecessary spaces.Learn more at
5505.1.1 https://support.google.com/mail/?p=NoSuchUser p34si3372771otp.228-gsmtp
如果查詢的是一個真實的 Email 地址嫉拐,郵件服務(wù)器就會返回 250 狀態(tài)碼。
RCPT TO:<yifeng.ruan@gmail.com>
250 2.1.5 OK p34si3372771otp.228 - gsmtp
一般來說魁兼,狀態(tài)碼 250 和 251 都表示郵箱存在婉徘,狀態(tài)碼 5xx 表示不存在,其他狀態(tài)碼(主要是 4xx)則代表無法確認(rèn)咐汞。
RCPT TO:<xxx@censored.pl>
451 Temporary local problem - please try later
驗證完成后盖呼,使用 QUIT 命令關(guān)閉 TCP 連接。
QUIT
221 2.0.0 closing connection p34si3372771otp.228 - gsmtp