Email 是最常用的使用者識別手段。
開發者常常需要驗證郵箱的真實性。一般的方法是,註冊時向該郵箱發出一封驗證郵件,要求使用者點選郵件裡面的連結。
但是很多時候(比如要搞郵件營銷時),拿到的是成千上萬現成的 Email 地址,不可能透過回覆確認真實性,這時該怎麼辦呢?
答案就是使用 SMTP 協議。本文將介紹如何透過該協議驗證郵箱的真假。
另外,結尾處還有一則移動端 H5 開發的培訓訊息,歡迎關注。
一、SMTP 協議簡介
SMTP 是"簡單郵件傳輸協議"(Simple Mail Transfer Protocol)的縮寫,基於 TCP 協議,用來傳送電子郵件。
只要執行了該協議的伺服器端(daemon),當前伺服器就變為郵件伺服器,可以接收電子郵件。
驗證 Email 郵箱的基本思路如下。
- 找到郵箱所在域名的 SMTP 伺服器
- 連線該伺服器
- 詢問有沒有該郵箱
- 如果伺服器返回 250 或 251 狀態碼,郵箱就是真的;如果返回 5xx(500~599),就是假的。
注意,即使伺服器確認郵箱是真的, 也不代表郵件一定會傳送到該郵箱,更不代表使用者一定會讀到該郵件。
二、查詢域名的 MX 記錄
下面透過一個例子,演示如何驗證[email protected]
這個郵箱。
首先,需要查詢gmail.com
的 MX 記錄。它指向真正處理郵件的那臺伺服器。
$ nslookup >
輸入nslookup
命令後,會提示一個大於號,表示等待使用者進一步輸入。
> set q=mx > gmail.com
上面程式碼中,set q=mx
設定查詢的是 MX 記錄,第二行輸入要查詢的域名,結果返回了5條 MX 記錄。
Server: 192.168.1.1 Address: 192.168.1.1#53 Non-authoritative answer: gmail.com mail exchanger = 20 alt2.gmail-smtp-in.l.google.com. gmail.com mail exchanger = 30 alt3.gmail-smtp-in.l.google.com. gmail.com mail exchanger = 10 alt1.gmail-smtp-in.l.google.com. gmail.com mail exchanger = 5 gmail-smtp-in.l.google.com. gmail.com mail exchanger = 40 alt4.gmail-smtp-in.l.google.com.
gmail.com
是很大的郵件服務商,所以會有多條記錄,一般的域名只有一條。如果這一步查不到 MX 記錄,該郵箱肯定是假的。
除了自己執行nslookup
,也可以使用線上服務(1,2,3)。更多 DNS 的介紹,請參考《DNS 原理入門》。
三、建立 TCP 連線
知道了郵件伺服器的地址,就可以與它建立 TCP 連線了。SMTP 協議的預設埠是25。使用 Telnet 或 Netcat 命令,都可以連線該埠。
$ telnet gmail-smtp-in.l.google.com 25 # 或者 $ nc gmail-smtp-in.l.google.com 25
伺服器返回220
狀態碼,就表示連線成功。
220 mx.google.com ESMTP f14si7006176pln.607 - gsmtp
接下來,就可以使用 SMTP 協議的各種命令與郵件伺服器互動了。
四、HELO 命令和 EHLO 命令
SMTP 協議規定,連線成功後,必須向郵件伺服器提供連線的域名,也就是郵件將從哪臺伺服器發來。
假定從[email protected]
向[email protected]
傳送郵件,這裡要提供的域名就是example.com
。
HELO exampl.com
郵件伺服器返回狀態碼250
,表示響應成功。
250 mx.google.com at your service
不過,HELO
命令現在比較少用,一般都使用EHLO
命令。
EHLO example.com
郵件伺服器收到EHLO
命令以後,不僅會返回250
狀態碼,還會返回自己支援的各種擴充套件的列表。
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
命令,向郵件伺服器提供郵件的來源郵箱。
MAIL FROM:<[email protected]>
上面程式碼表示,連線者將從[email protected]
向郵件伺服器傳送郵件。郵件伺服器返回250
狀態碼,表示響應成功。
250 2.1.0 OK h10si3194349otb.59 - gsmtp
SMTP 是一個很簡單的協議,本身沒有規定如何驗證郵件的來源,也就是說,不驗證郵件是否真的從[email protected]
發來,所以導致了後來垃圾郵件氾濫。為了控制垃圾郵件,許多郵件伺服器會用自己的方法驗證郵件地址,下面就是其中的一些方法。
- example.com 是否有 MX 記錄
- example.com 是否可以 Ping 通
- 是否存在 [email protected] 這個郵箱
- 發起連線的 IP 地址是否在黑名單之中
- IP 地址的反向 DNS 解析,是否指向一個郵件伺服器
六、RCPT TO 命令
最後一步就是使用RCPT TO
命令,驗證郵件地址是否存在。
RCPT TO:<[email protected]>
郵件伺服器返回了550
狀態碼,表示該 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 address for typos or 550-5.1.1 unnecessary spaces. Learn more at 550 5.1.1 https://support.google.com/mail/?p=NoSuchUser p34si3372771otp.228 - gsmtp
如果查詢的是一個真實的 Email 地址,郵件伺服器就會返回250
狀態碼。
RCPT TO:<[email protected]> 250 2.1.5 OK p34si3372771otp.228 - gsmtp
一般來說,狀態碼 250 和 251 都表示郵箱存在,狀態碼 5xx 表示不存在,其他狀態碼(主要是 4xx)則代表無法確認。
RCPT TO:<[email protected]> 451 Temporary local problem - please try later
驗證完成後,使用QUIT
命令關閉 TCP 連線。
QUIT 221 2.0.0 closing connection p34si3372771otp.228 - gsmtp
七、參考連結
(正文完)
==============================
下面是推廣時間。移動端開發的市場廣,就業潛力大,現在有一門移動端 H5 開發的課程推薦給大家。
海棠學院是一家專業的前端教育機構,一直與我有合作、受到很多學員好評。他們這次推出《移動端開發 + 職業技能》大型公開課,介紹 H5 開發,為期三週。
該課程將帶領您一步一步學習移動端頁面的開發,手把手教你做出下面的頁面。
完整的課程大綱請參考這裡。
除了技術課程,還會有一次《前端開發流程、求職、職場》的公開課,由海棠學院創始人張小河主講,幫助你瞭解前端工程師的就業市場和職業規劃。
- 前端新手如何進入喜歡的公司?
- 公司真實的開發流程是怎麼樣的?
- 為什麼看了 100G 的影片/資料,你也沒有學好?
- 如何成為高年薪的前端工程師?
這堂公開課是免費的,點選這裡瞭解詳情。
(完)