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,也可以使用线上服务(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 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

SMTP 协议,验证 Email 地址相关推荐

  1. 【廖雪峰】写一个验证Email地址的正则表达式

    最近在看廖雪峰的Python啦,已经看到正则了,突然想起来可以在博客记录一下下~ 无论对错都请多多指教,谢谢~ 要求: 廖雪峰Python教程链接 请尝试写一个验证Email地址的正则表达式.版本一应 ...

  2. 请尝试写一个验证Email地址的正则表达式。版本一应该可以验证出类似的Email —— python学习笔记

    Python正则表达式的练习 1.1 请尝试写一个验证Email地址的正则表达式.版本一应该可以验证出类似的Email someone@gmail.com bill.gates@microsoft.c ...

  3. Python: email-validator验证Email地址

    Python: email-validator验证Email地址 文档: PyPI: https://pypi.org/project/email-validator/ Github: https:/ ...

  4. [python] 使用正则表达式验证email地址是否有效

    假定email地址的必要形式为: xxxxxx@xxxxxxxx.xxxxxx 其他一概不作检查,对应的RE应为:[^@]+@[^@]+\.[^@]+ 验证脚本: import re p = re.c ...

  5. JavaScript验证Email地址

    电子邮件地址具有以下统一的标准格式:用户名@服务器域名. 用户名表示邮件信箱.注册名或信件接收者的用户标识,@符号后是你使用的邮件服务器的域名.@可以读成"at",也就是" ...

  6. nginx $mail-send()发送邮件报错_基于SMTP协议的E-MAIL电子邮件发送客户端软件C#实现...

    摘 要 电子邮件在当今社会中扮演了一个很重要的角色.越来越多的人在使用它.而且用它的人数势必会继续增加.虽然,现在已经有很多的邮件收发软件例如著名的FoxMail 但是对于大多数的非专业的人来说它还是 ...

  7. java验证Email地址

    private static boolean getEmail(String line){     Pattern p = Pattern.compile("\\w+([-+.]\\w+)* ...

  8. RegExp表达式 Email地址验证

    要做更精确地匹配,可以用[]表示范围,比如: [0-9a-zA-Z\_]可以匹配一个数字.字母或者下划线: [0-9a-zA-Z\_]+可以匹配至少由一个数字.字母或者下划线组成的字符串,比如'a10 ...

  9. 如何校验 email 地址以提高邮件送达率

    背景 在发送 email 的时候,如果邮件收件人是一个不存在的 email 账号.或者收件人账号存在问题.收件箱无法接收 email, 那么 email server 就会将该无法接收的信息响应回来, ...

最新文章

  1. 【鸿蒙 HarmonyOS】UI 组件 ( Text 组件 )
  2. python断点续传下载_Python版本,图片,视频断点续传下载
  3. haproxy配置文件详解--转
  4. qpython3l手机版怎么用_qpython怎么用
  5. linux配置dhcp中继服务
  6. 31/100. Palindromic Substrings
  7. message show_once这个标志位的用法
  8. Java初始化顺序研究
  9. 基4fft算法的蝶形图_原地且自动整序的FFT算法
  10. 前端开发教程:使用 CSS3 Transforms 构建圆形导航
  11. vsftp启用root用户
  12. Dubbo 快速入门教程
  13. What are FeliCa and PaSoRi?
  14. 组建团队--共同愿景
  15. 弱网优化、网络抖动、网络延时,这些问题,怎么处理?
  16. U盘装Win11教程 系统之家装机教程
  17. jsp内置对象-session对象
  18. OSF Jonathan Bryce:Open Infrastructure开启开放协作新时代
  19. Scratch软件编程等级考试一级——20200913
  20. 转:安迪·格鲁夫:你无法避免开会,但可以让它更有效率

热门文章

  1. 潍坊医学院本科毕业论文答辩PPT模板
  2. jumbo frame介绍
  3. matlab机器人 联合ug仿真
  4. Kali渗透测试-远程控制:6200端口变成“后门”
  5. fre740变频器参数_三菱变频器参数设置教程
  6. 【怀旧】 “AutoCAD 经典”界面
  7. 264编码 yocto_评测
  8. Kotlin的型变解析(协变、逆变和不变)
  9. 台达触摸屏与多台变频器485通信 温控器通信
  10. 从云码课堂出来拿12K,女生做Java也挺吃香