编程实现邮件地址有效性检测

** 编者按: ** 检测邮件地址的有效性可应用于防止垃圾邮件、用户非法注册等方面,本文将以编程的方式进行探讨,相信能给大家一些启示。

** 编程实现邮件地址有效性检测

**

** 文 /brain **

这个 VB6COM 组件提供了一项即时邮件查询的功能。它有效的避免了向一个不存在的账户发送邮件的情况。例如,在 ASP 页面里面检查用户输入的邮件地址是否正确,并避免在你的用户数据库里面存储相关的错误信息。

主要内容

** 工作原理

**

让我们首先来看一下这个组件是如何进行工作的。

首先给定一个 E-mail 地址(例如: [email protected] ),然后它会执行如下的步骤:

1、 将用户名( someone )从域名( somewhere.com )中分离出来;

2、 在 DNS (域名服务器)上进行查询:域名是否可用;

3、 如果 DNS 做出响应,它将在服务器上对 MX 进行查询( Mail Exchanger 邮件交换服务器),并试着与在这个域中每一个 MX 建立会话,直到建立会话成功;

4、 通过使用 SMTP 协议,它使用 VRFY 命令和 Mail handshake ( HELO , MAILT FROM , RCPT TO )来验证用户名在该域中的存在;

5、 随后组件将返回测试的结果,并给出四种可能的结果:

l “域”不存在。服务器做出否定响应。

l “域”存在,但是无法查询用户名(见注释)。服务器做出部分确认响应。

l “域”存在,但是用户名不存在。服务器做出否定响应。

l “域”和用户名都存在。服务器做出完全确认响应。

** 注释:

**

如果“域”存在,但是 MX (邮件交换服务器)并不存在于该域中(典型特征是二级域名由 ISP 掌握着),这样通过 SMTP 协议将会无效,应为那些服务器被指派去接受子域中的邮件,并且根本不会检查用户名。所以组建的程序设计,从这里跳出并返回出部分确认响应。


** 组件特征

**

l 在本地机器上查找 DNS 。所以必须保持计算机与互联网的连接以确保组建的正常工作

l 通过 SimpleDNSRosolover 组件(见 Credits )发送 DNS 请求

l 使用 UPD 协议接收 DNS 响应

l 经过标准的 winsock.ocx 接口,建立 SMTP 会话

l 提供小型的可执行文件(编译为一个小于 50kb 的 ActiveX DLL 动态连接库文件)

l 无任何用户接口,需要 ActiveX 组建支持的语言(例如, VBScript, ASP, VC++ 等等)

l 使用 VB6.0 Service Pack 4( 已测试 ) 环境下编译,当然也可以在以前的支持 winsock.ocx 的 VB 版本中编译(例如 VB5.0 )

** 安装方法

**

l 将压缩包释放到你选定的目录中;

l 将 VfabEmailUtils.DLL 拷贝到你的系统目录下:

对于 Windows NT : C:\WINNT\SYSTEM32\

对于 Windows 9 x : C:\WINDOWS\SYSTEM\

l 在注册表中注册组件:

在运行中输入: regsvr 32 c :\winnt\system32\VfabEmailUtils.dll

l 重要提示:

为确保组件的正常运行,你必须安装 Simple DNS Resolver v1.0 ( Emmanuel Kartmann’s )。相关信息,请看下面的 Credits 。

** 使用方法

**

l 创建一个组建的应用实例

l 加入属性:
EmailAddr
SmtpTimeOut
DNS Server Address (仅限 Windows9x )

l 调用 CheckDomain 方法

l 测试 Result 属性,如果返回的结果不等于 vfbInvalidDomain ( 1 )则可以进行如下操作

l 调用 CheckUserName 方法

l 然后测试 Result 属性来返回最终结果:
vfabNotVerify = 0
vfabInvalidDomain = 1
vfabValidDomain = 2
vfabValidDomainInvalidAccount = 3
vfabValidDomainValidAccount = 4

** 示例代码

**

dim oVfab

set oVfab=CreateObject("VFabEmailUtils.EmailCheck") ' 创建对象

oVfab.EmailAddr = Request.Form("EMAIL")

' 从 ASP 页面获得邮件地址以进行测试,

' 并指派给该对象中的 EmailAddr 属性

oVfab.CheckDomain ' 检查域是否存在

If oVfab.Result <> 1 Then

' 如果存在则对用户名进行检测

oVfab.SmtpTimeOut = 10 ' 给该对象 10 秒钟的时间用来连接远程 SMTP 服务器

oVfab.CheckUserName ' 尝试进行 SMTP 会话,测试用户名

End If

…… ' 在这里可以用 HTML 格式显示会话纪录

oVfab.Clear ' 关闭连接 , 清除日志 , 恢复初始状态

** 组件文档

**

方法(表 1 ):

名称

|

描述

---|---

CheckDomain()

|

检查邮件地址中的域名部分是否是有效的(存在的)域名

CheckUserName()

|

通过 SMTP 协议检查用户名是否是该域中的有效邮件账号

Clear()

|

在结束任务之后,关闭连接 , 清除日志 , 恢复初始状态

表 1

属性(表 2 ):

名称

|

类型

|

可读

|

可写

|

描述

---|---|---|---|---

EmailAddr

|

String

|

Yes

|

Yes

|

指定要检验的邮件地址

Result

|

Integer

|

Yes

|

No

|

从 CheckDomain 和(或) CheckUserName 方法中获得处理结果

SmtpTimeOut

|

Integer

|

Yes

|

Yes

|

获得 / 设置 Timeout (超时 - 秒计)等待 SMTP 连接

DnsServer

|

String

|

Yes

|

No

|

设置域名服务器的 IP 地址( Win9x 中为必选项, Windows NT 中为可选项)

RealName

|

String

|

Yes

|

No

|

在 CheckUserName() 被执行后,如果 SMTP 服务器提供的话,获得用户的真实名称

DomainName

|

String

|

Yes

|

No

|

获得 EmailAddr 中的域名部分

UserName

|

String

|

Yes

|

No

|

获得 EmailAddr 中的用户名部分

Log(blnHTML)

|

String

|

Yes

|

<span lang="EN-US" style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; ms

Published At
Categories with Web编程
Tagged with
comments powered by Disqus