【转载】如何验证 Email 地址:SMTP 协议入门教程

姓名:何瑞           学号:17021211237

原文链接:http://www.ruanyifeng.com/blog/2017/06/smtp-protocol.html#support

原文作者:阮一峰

【嵌牛导读】:Email 是最常用的用户识别手段。开发者常常需要验证邮箱的真实性。一般的方法是,注册时向该邮箱发出一封验证邮件,要求用户点击邮件里面的链接。但是很多时候(比如要搞邮件营销时),拿到的是成千上万现成的 Email 地址,不可能通过回复确认真实性,这时该怎么办呢?答案就是使用SMTP 协议。本文将介绍如何通过该协议验证邮箱的真假。

【嵌牛鼻子】:Email验证、SMTP协议

【嵌牛提问】:如何验证Email地址?

【嵌牛正文】

一、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

>

(实验在Windows命令行)输入 nslookup 命令后,会提示一个大于号,表示等待用户进一步输入。

> set q=mx

> gmail.com

上面代码中,set q=mx 设定查询的是 MX 记录,第二行输入要查找的域名,结果返回了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 是很大的邮件服务商,所以会有多条记录,一般的域名只有一条。如果这一步查不到 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.com test@gmail.com 发送邮件,这里要提供的域名就是example.com

HELO exampl.com

注意:windows命令行在tcp连接建立成功后输入交互信息(如: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 发来,所以导致了后来垃圾邮件泛滥。为了控制垃圾邮件,许多邮件服务器会用自己的方法验证邮件地址,下面就是其中的一些方法。

1. example.com 是否有 MX 记录

2. example.com 是否可以 Ping 通

3. 是否存在 postmaster@example.com 这个邮箱

4. 发起连接的 IP 地址是否在黑名单之中

5. 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 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 地址,邮件服务器就会返回 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

七、参考链接

How to Verify Email Address

Simple Mail Transfer Protocol

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容

  • 28.1 引言 电子邮件(e-mail)无疑是最流行的应用程序。[Caceres et al.1991]说明,所有...
    张芳涛阅读 3,727评论 0 6
  • Python 面向对象Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对...
    顺毛阅读 4,207评论 4 16
  • 本文包括:1、名词解释2、邮件收发过程3、JavaMail 知识概要4、发送一封符合 MIME 协议的 JavaM...
    廖少少阅读 3,986评论 2 13
  • 《五古.秋山 》 空山冷月钩, 寒水绕云楼。 流雾隐斜棹, 湖影黯偏舟。 草枯知霜重, 叶黄预晚秋。 天寒枝更瘦,...
    云兮云兮阅读 365评论 8 11
  • 早饭 在家把黑豆浆喝了,在车上吃早饭。 中饭,因为中午没回家,就在外面吃了 中午牛肉滑蛋里的青椒辣的,基本没吃,晚...
    Helen_ZhangTT阅读 163评论 0 0