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

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

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

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

另外,结尾处还有一则移动端 H5 开发的培训消息,欢迎关注。

一、SMTP 协议简介

SMTP 是"简单邮件传输协议"(Simple Mail Transfer Protocol)的缩写,基于 TCP 协议,用来发送电子邮件。

只要运行了该协议的服务器端(daemon),当前服务器就变为邮件服务器,可以接收电子邮件。

验证 Email 邮箱的基本思路如下。

  1. 找到邮箱所在域名的 SMTP 服务器
  2. 连接该服务器
  3. 询问有没有该邮箱
  4. 如果服务器返回 250 或 251 状态码,邮箱就是真的;如果返回 5xx(500~599),就是假的。

注意,即使服务器确认邮箱是真的, 也不代表邮件一定会发送到该邮箱,更不代表用户一定会读到该邮件。

二、查找域名的 MX 记录

下面通过一个例子,演示如何验证[email protected]ail.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#53Non-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 协议规定,连接成功后,必须向邮件服务器提供连接的域名,也就是邮件将从哪台服务器发来。

假定从[email protected][email protected]发送邮件,这里要提供的域名就是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:<[email protected]>

上面代码表示,连接者将从[email protected]向邮件服务器发送邮件。邮件服务器返回250状态码,表示响应成功。

250 2.1.0 OK h10si3194349otb.59 - gsmtp

SMTP 是一个很简单的协议,本身没有规定如何验证邮件的来源,也就是说,不验证邮件是否真的从[email protected]发来,所以导致了后来垃圾邮件泛滥。为了控制垃圾邮件,许多邮件服务器会用自己的方法验证邮件地址,下面就是其中的一些方法。

  • example.com 是否有 MX 记录
  • example.com 是否可以 Ping 通
  • 是否存在 [email protected] 这个邮箱
  • 发起连接的 IP 地址是否在黑名单之中
  • IP 地址的反向 DNS 解析,是否指向一个邮件服务器

六、RCPT TO 命令

最后一步就是使用RCPT TO命令,验证邮件地址是否存在。

RCPT TO:<[email protected]>

邮件服务器返回了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:<[email protected]>
250 2.1.5 OK p34si3372771otp.228 - gsmtp

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

RCPT TO:<[email protected]>
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

(正文完)

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

下面是推广时间。移动端开发的市场广,就业潜力大,现在有一门移动端 H5 开发的课程推荐给大家。

海棠学院是一家专业的前端教育机构,一直与我有合作、受到很多学员好评。他们这次推出《移动端开发 + 职业技能》大型公开课,介绍 H5 开发,为期三周。

该课程将带领您一步一步学习移动端页面的开发,手把手教你做出下面的页面。

完整的课程大纲请参考这里。

除了技术课程,还会有一次《前端开发流程、求职、职场》的公开课,由海棠学院创始人张小河主讲,帮助你了解前端工程师的就业市场和职业规划。

  • 前端新手如何进入喜欢的公司?
  • 公司真实的开发流程是怎么样的?
  • 为什么看了 100G 的视频/资料,你也没有学好?
  • 如何成为高年薪的前端工程师?

这堂公开课是免费的,点击这里了解详情。

(完)

如何验证 Email 地址:SMTP 协议入门教程相关推荐

  1. 在服务器上关闭smtp协议,SMTP 协议入门教程

    Email 是最常用的用户识别手段. 开发者常常需要验证邮箱的真实性.一般的方法是,注册时向该邮箱发出一封验证邮件,要求用户点击邮件里面的链接. 但是很多时候(比如要搞邮件营销时),拿到的是成千上万现 ...

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

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

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

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

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

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

  5. SMTP 协议,验证 Email 地址

    Email 是最常用的用户识别手段. 开发者常常需要验证邮箱的真实性.一般的方法是,注册时向该邮箱发出一封验证邮件,要求用户点击邮件里面的链接. 但是很多时候(比如要搞邮件营销时),拿到的是成千上万现 ...

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

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

  7. JavaScript验证Email地址

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

  8. java验证Email地址

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

  9. smtp协议源ip是服务器地址吗,Smtp协议发送邮件

    Smtp协议发送邮件,是最全面的smtp协议发送邮件教程!有助于新手快速入门,从而跟好的进阶学习.本文档内容丰富,知识全面,简单易懂 Smtp协议发送邮件 MTP(Simple Mail Transf ...

  10. RegExp表达式 Email地址验证

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

最新文章

  1. CentOS7 搭建GIT环境
  2. Python网络编程—(TCP、UDP区别)
  3. python引入redis_十六大Python面试题!看完面试官给了我40K的薪资
  4. 北美暴风雨,Linux5.12被延迟6天发布
  5. div contenteditable 换行_contenteditable跟style标签可真是天生一对
  6. windows环境下使用virtualenv对python进行多版本隔离
  7. 一个容易失误的字符串转字符问题
  8. Android 关于定位中的那点事(GPS,GPGGA,NMEA-0183,RTCM)
  9. 苹果计算机怎么切换科学计算机,Mac如何使用科学计算器
  10. AI机器学习实战の电磁导航智能车中神经网络应用的问题与思考-交流向-本科生竞赛
  11. 三端稳压管怎么接线及方法说明
  12. Android改变标题栏背景颜色
  13. YOLOv5实现吸烟行为检测
  14. 无扩展,不 Chrome
  15. 企业ERP管理系统原型
  16. Codeforces Problemset
  17. 零知识证明:重要构造
  18. 为什么那么多人想开发一元夺宝类app?
  19. 黄河科技学院计算机应用技术在哪个校区,黄河科技学院成考计算机应用技术(高升专)专业_黄河科技学院成考报名_成考计算机应用技术专业就业方向_中国教育在线...
  20. 王劲首度解析景驰:我们是跑得最快的无人驾驶公司(内含独家视频)

热门文章

  1. 【症状】 神经衰弱的六大症状
  2. [附源码]Java计算机毕业设计SSM超市进销存系统
  3. 国二计算机学什么最好,全国计算机专业“最好”的4所大学,榜首实至名归,清华仅第二...
  4. Java设计模式-抽象工厂模式
  5. 人生需要放下的八样东西
  6. CNN感性认识(一)——BP神经网络
  7. 洛谷P1186 玛丽卡 spfa+删边
  8. 【转载】一叶菩提-快捷键
  9. 钣金加工工艺难点及改进措施分析
  10. easypoi excel导入导出(多sheet)