zoukankan      html  css  js  c++  java
  • 如何验证 Email 地址:SMTP 协议入门教程

    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,也可以使用线上服务(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.comtest@gmail.com发送邮件,这里要提供的域名就是www.10rz.net

    
    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:<.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:<.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..com>
    250 2.1.5 OK p34si3372771otp.228 - gsmtp
    

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

    
    RCPT TO:<.pl>
    451 Temporary local problem - please try later
    

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

    
    QUIT
    221 2.0.0 closing connection p34si3372771otp.228 - gsmtp
  • 相关阅读:
    决策树之C4.5算法
    决策树之ID3算法
    AndroidStudio 3.4.2配置 Opencv 3.7
    Android 实现在ImageView上绘图
    Opencv 对比度增强 C++
    Opencv对比度增强 python API
    hive中与hbase外部表join时内存溢出(hive处理mapjoin的优化器机制)
    hive的数据导入与数据导出:(本地,云hdfs,hbase),列分隔符的设置,以及hdfs上传给pig如何处理
    hive的map类型处理
    pig的udf编写
  • 原文地址:https://www.cnblogs.com/tianshifu/p/7156470.html
Copyright © 2011-2022 走看看