如何驗證 Email 地址:SMTP 協議入門教程

阮一峰發表於2017-06-25

Email 是最常用的使用者識別手段。

開發者常常需要驗證郵箱的真實性。一般的方法是,註冊時向該郵箱發出一封驗證郵件,要求使用者點選郵件裡面的連結。

但是很多時候(比如要搞郵件營銷時),拿到的是成千上萬現成的 Email 地址,不可能通過回覆確認真實性,這時該怎麼辦呢?

答案就是使用 SMTP 協議。本文將介紹如何通過該協議驗證郵箱的真假。

另外,結尾處還有一則移動端 H5 開發的培訓訊息,歡迎關注。

一、SMTP 協議簡介

SMTP 是"簡單郵件傳輸協議"(Simple Mail Transfer Protocol)的縮寫,基於 TCP 協議,用來傳送電子郵件。

只要執行了該協議的伺服器端(daemon),當前伺服器就變為郵件伺服器,可以接收電子郵件。

驗證 Email 郵箱的基本思路如下。

  1. 找到郵箱所在域名的 SMTP 伺服器
  2. 連線該伺服器
  3. 詢問有沒有該郵箱
  4. 如果伺服器返回 250 或 251 狀態碼,郵箱就是真的;如果返回 5xx(500~599),就是假的。

注意,即使伺服器確認郵箱是真的, 也不代表郵件一定會傳送到該郵箱,更不代表使用者一定會讀到該郵件。

二、查詢域名的 MX 記錄

下面通過一個例子,演示如何驗證test@gmail.com這個郵箱。

首先,需要查詢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,也可以使用線上服務(123)。更多 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 協議規定,連線成功後,必須向郵件伺服器提供連線的域名,也就是郵件將從哪臺伺服器發來。

假定從mail@example.comtest@gmail.com傳送郵件,這裡要提供的域名就是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:<mail@example.com>

上面程式碼表示,連線者將從mail@example.com向郵件伺服器傳送郵件。郵件伺服器返回250狀態碼,表示響應成功。


250 2.1.0 OK h10si3194349otb.59 - gsmtp

SMTP 是一個很簡單的協議,本身沒有規定如何驗證郵件的來源,也就是說,不驗證郵件是否真的從mail@example.com發來,所以導致了後來垃圾郵件氾濫。為了控制垃圾郵件,許多郵件伺服器會用自己的方法驗證郵件地址,下面就是其中的一些方法。

  • example.com 是否有 MX 記錄
  • example.com 是否可以 Ping 通
  • 是否存在 postmaster@example.com 這個郵箱
  • 發起連線的 IP 地址是否在黑名單之中
  • IP 地址的反向 DNS 解析,是否指向一個郵件伺服器

六、RCPT TO 命令

最後一步就是使用RCPT TO命令,驗證郵件地址是否存在。


RCPT TO:<test@gmail.com>

郵件伺服器返回了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:<yifeng.ruan@gmail.com>
250 2.1.5 OK p34si3372771otp.228 - gsmtp

一般來說,狀態碼 250 和 251 都表示郵箱存在,狀態碼 5xx 表示不存在,其他狀態碼(主要是 4xx)則代表無法確認。


RCPT TO:<xxx@censored.pl>
451 Temporary local problem - please try later

驗證完成後,使用QUIT命令關閉 TCP 連線。


QUIT
221 2.0.0 closing connection p34si3372771otp.228 - gsmtp

七、參考連結

(正文完)

==============================

下面是推廣時間。移動端開發的市場廣,就業潛力大,現在有一門移動端 H5 開發的課程推薦給大家。

海棠學院是一家專業的前端教育機構,一直與我有合作、受到很多學員好評。他們這次推出《移動端開發 + 職業技能》大型公開課,介紹 H5 開發,為期三週。

該課程將帶領您一步一步學習移動端頁面的開發,手把手教你做出下面的頁面。

完整的課程大綱請參考這裡

除了技術課程,還會有一次《前端開發流程、求職、職場》的公開課,由海棠學院創始人張小河主講,幫助你瞭解前端工程師的就業市場和職業規劃。

  • 前端新手如何進入喜歡的公司?
  • 公司真實的開發流程是怎麼樣的?
  • 為什麼看了 100G 的視訊/資料,你也沒有學好?
  • 如何成為高年薪的前端工程師?

這堂公開課是免費的,點選這裡瞭解詳情。

(完)

相關文章