【轉(zhuǎn)載】如何驗證 Email 地址:SMTP 協(xié)議入門教程

姓名:何瑞 ????????? 學(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咧纠,23)泻骤。更多 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

七化撕、參考鏈接

How to Verify Email Address

Simple Mail Transfer Protocol

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末几晤,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子植阴,更是在濱河造成了極大的恐慌蟹瘾,老刑警劉巖圾浅,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異憾朴,居然都是意外死亡狸捕,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進店門伊脓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來府寒,“玉大人,你說我怎么就攤上這事报腔≈晟Γ” “怎么了?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵纯蛾,是天一觀的道長纤房。 經(jīng)常有香客問我,道長翻诉,這世上最難降的妖魔是什么炮姨? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮碰煌,結(jié)果婚禮上舒岸,老公的妹妹穿的比我還像新娘。我一直安慰自己芦圾,他們只是感情好蛾派,可當(dāng)我...
    茶點故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著个少,像睡著了一般洪乍。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上夜焦,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天壳澳,我揣著相機與錄音,去河邊找鬼茫经。 笑死巷波,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的卸伞。 我是一名探鬼主播褥紫,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼瞪慧!你這毒婦竟也來了髓考?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤弃酌,失蹤者是張志新(化名)和其女友劉穎氨菇,沒想到半個月后儡炼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡查蓉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年乌询,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片豌研。...
    茶點故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡妹田,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出鹃共,到底是詐尸還是另有隱情鬼佣,我是刑警寧澤,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布霜浴,位于F島的核電站晶衷,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏阴孟。R本人自食惡果不足惜晌纫,卻給世界環(huán)境...
    茶點故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望永丝。 院中可真熱鬧锹漱,春花似錦、人聲如沸慕嚷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽闯冷。三九已至,卻和暖如春懈词,著一層夾襖步出監(jiān)牢的瞬間蛇耀,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工坎弯, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留纺涤,地道東北人。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓抠忘,卻偏偏與公主長得像撩炊,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子崎脉,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,884評論 2 354

推薦閱讀更多精彩內(nèi)容