日期:2014-02-07  浏览次数:20507 次


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



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



文/brain



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



主要内容



工作原理



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



首先给定一个E-mail地址(例如:someone@somewhere.com),然后它会执行如下的步骤:



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 YSTEM32\



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



l   在注册表中注册组件:



在运行中输入:regsvr32 c:\winnt ystem32\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     &