如何验证 Email 地址:SMTP 协议入门教程
Email 是最常用的用户识别手段。
开发者常常需要验证邮箱的真实性。一般的方法是,注册时向该邮箱发出一封验证邮件,要求用户点击邮件里面的链接。
但是很多时候(比如要搞邮件营销时),拿到的是成千上万现成的 Email 地址,不可能通过回复确认真实性,这时该怎么办呢?
答案就是使用 SMTP 协议。本文将介绍如何通过该协议验证邮箱的真假。
另外,结尾处还有一则移动端 H5 开发的培训消息,欢迎关注。
一、SMTP 协议简介
SMTP 是"简单邮件传输协议"(Simple Mail Transfer Protocol)的缩写,基于 TCP 协议,用来发送电子邮件。
只要运行了该协议的服务器端(daemon),当前服务器就变为邮件服务器,可以接收电子邮件。
验证 Email 邮箱的基本思路如下。
- 找到邮箱所在域名的 SMTP 服务器
- 连接该服务器
- 询问有没有该邮箱
- 如果服务器返回 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 协议入门教程相关推荐
- 在服务器上关闭smtp协议,SMTP 协议入门教程
Email 是最常用的用户识别手段. 开发者常常需要验证邮箱的真实性.一般的方法是,注册时向该邮箱发出一封验证邮件,要求用户点击邮件里面的链接. 但是很多时候(比如要搞邮件营销时),拿到的是成千上万现 ...
- 【廖雪峰】写一个验证Email地址的正则表达式
最近在看廖雪峰的Python啦,已经看到正则了,突然想起来可以在博客记录一下下~ 无论对错都请多多指教,谢谢~ 要求: 廖雪峰Python教程链接 请尝试写一个验证Email地址的正则表达式.版本一应 ...
- 请尝试写一个验证Email地址的正则表达式。版本一应该可以验证出类似的Email —— python学习笔记
Python正则表达式的练习 1.1 请尝试写一个验证Email地址的正则表达式.版本一应该可以验证出类似的Email someone@gmail.com bill.gates@microsoft.c ...
- Python: email-validator验证Email地址
Python: email-validator验证Email地址 文档: PyPI: https://pypi.org/project/email-validator/ Github: https:/ ...
- SMTP 协议,验证 Email 地址
Email 是最常用的用户识别手段. 开发者常常需要验证邮箱的真实性.一般的方法是,注册时向该邮箱发出一封验证邮件,要求用户点击邮件里面的链接. 但是很多时候(比如要搞邮件营销时),拿到的是成千上万现 ...
- [python] 使用正则表达式验证email地址是否有效
假定email地址的必要形式为: xxxxxx@xxxxxxxx.xxxxxx 其他一概不作检查,对应的RE应为:[^@]+@[^@]+\.[^@]+ 验证脚本: import re p = re.c ...
- JavaScript验证Email地址
电子邮件地址具有以下统一的标准格式:用户名@服务器域名. 用户名表示邮件信箱.注册名或信件接收者的用户标识,@符号后是你使用的邮件服务器的域名.@可以读成"at",也就是" ...
- java验证Email地址
private static boolean getEmail(String line){ Pattern p = Pattern.compile("\\w+([-+.]\\w+)* ...
- smtp协议源ip是服务器地址吗,Smtp协议发送邮件
Smtp协议发送邮件,是最全面的smtp协议发送邮件教程!有助于新手快速入门,从而跟好的进阶学习.本文档内容丰富,知识全面,简单易懂 Smtp协议发送邮件 MTP(Simple Mail Transf ...
- RegExp表达式 Email地址验证
要做更精确地匹配,可以用[]表示范围,比如: [0-9a-zA-Z\_]可以匹配一个数字.字母或者下划线: [0-9a-zA-Z\_]+可以匹配至少由一个数字.字母或者下划线组成的字符串,比如'a10 ...
最新文章
- CentOS7 搭建GIT环境
- Python网络编程—(TCP、UDP区别)
- python引入redis_十六大Python面试题!看完面试官给了我40K的薪资
- 北美暴风雨,Linux5.12被延迟6天发布
- div contenteditable 换行_contenteditable跟style标签可真是天生一对
- windows环境下使用virtualenv对python进行多版本隔离
- 一个容易失误的字符串转字符问题
- Android 关于定位中的那点事(GPS,GPGGA,NMEA-0183,RTCM)
- 苹果计算机怎么切换科学计算机,Mac如何使用科学计算器
- AI机器学习实战の电磁导航智能车中神经网络应用的问题与思考-交流向-本科生竞赛
- 三端稳压管怎么接线及方法说明
- Android改变标题栏背景颜色
- YOLOv5实现吸烟行为检测
- 无扩展,不 Chrome
- 企业ERP管理系统原型
- Codeforces Problemset
- 零知识证明:重要构造
- 为什么那么多人想开发一元夺宝类app?
- 黄河科技学院计算机应用技术在哪个校区,黄河科技学院成考计算机应用技术(高升专)专业_黄河科技学院成考报名_成考计算机应用技术专业就业方向_中国教育在线...
- 王劲首度解析景驰:我们是跑得最快的无人驾驶公司(内含独家视频)