Email 是最常用的用户识别手段。


开发者常常需要验证邮箱的真实性。一般的方法是,注册时向该邮箱发出一封验证邮件,要求用户点击邮件里面的链接。

但是很多时候(比如要搞邮件营销时),拿到的是成千上万现成的 Email 地址,不可能通过回复确认真实性,这时该怎么办呢?

答案就是使用 SMTP 协议。本文将介绍如何通过该协议验证邮箱的真假。

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.1Address:    192.168.1.1Non-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 协议规定,连接成功后,必须向邮件服务器提供连接的域名,也就是邮件将从哪台服务器发来。

假定从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 157286400250-8BITMIME250-STARTTLS250-ENHANCEDSTATUSCODES250-PIPELINING250-CHUNKING250 SMTPUTF8

MAIL FROM 命令

然后,连接者要使用MAIL FROM命令,向邮件服务器提供邮件的来源邮箱。

MAIL FROM:

上面代码表示,连接者将从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:

邮件服务器返回了550状态码,表示该 Email 地址不存在。

550-5.1.1 The email account that you tried to reach does not exist. Please try550-5.1.1 double-checking the recipient's email address for typos or550-5.1.1 unnecessary spaces. Learn more at550 5.1.1  https://support.google.com/mail/?p=NoSuchUser p34si3372771otp.228 - gsmtp

如果查询的是一个真实的 Email 地址,邮件服务器就会返回250状态码。

RCPT TO:250 2.1.5 OK p34si3372771otp.228 - gsmtp

一般来说,状态码 250 和 251 都表示邮箱存在,状态码 5xx 表示不存在,其他状态码(主要是 4xx)则代表无法确认。

RCPT TO:451 Temporary local problem - please try later

验证完成后,使用QUIT命令关闭 TCP 连接。

QUIT221 2.0.0 closing connection p34si3372771otp


©著作权归作者所有:来自51CTO博客作者mob604756f5e525的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. Android(安卓)多模拟器使用adb shell
  2. Linux系统查看磁盘可用空间的5个命令
  3. Android(安卓)bluetooth介绍(四): a2dp connect流程分析
  4. Android(安卓)命令行编译、打包生成apk文件
  5. Ionic 运行报错No resource identifier found for attribute 'ap
  6. 使用sencha cmd创建android应用
  7. Android执行shell命令
  8. Android下模拟按键输入
  9. 【【【常用的ubuntu第三方工具及android命令(自存档)】】】二

随机推荐

  1. Android性能分析工具Systrace和TraceView
  2. Android(安卓)App 开源项目使用统计
  3. Android学习笔记19:ImageView实现图片适屏
  4. android 静默安装,含获取各种应用信息方法
  5. Android手机AP模式下本机IP
  6. Android(安卓)Hal 分析
  7. Android注解支持(Support Annotations)详
  8. Android音频架构性能分析
  9. [置顶] linux2.6驱动开发系列教程
  10. Android(安卓)Activity 中阻止自动弹出系