选择显示字体大小

通过探测邮件服务器进行email地址有效性检验

    email地址有效性的检验是一个经常遇到的问题啦!一般的检验方法是对email地址字符串进行简单的格式检验,如是否含有@ .等有效字符等。这种方法只能保证该地址从格式上看似有效,并不能保证地址可达。 最近进行大量的地址校验,写了一个小程序,可以检测email地址是否真正可达。

    email地址包括两个部分:用户名和邮件服务器。因此,检验邮件地址可以分为两步进行:首先检验邮件服务器,然后检验用户名。如brookes_luan@yahoo.com.cn,首先检验yahoo.com.cn服务器是否是有效的邮件服务器,如果是再在该服务器上确认是否存在brookes_luan用户。

    通过查询dns服务器,获取域名的mx(mail exchanger)记录,可以确定某一域名对应的邮件服务器是否有效。在windows系统中,可以使用nslookup程序来查看这一记录。

//通过nslookup程序查询mx记录,获取域名对应的mail服务器
public string getmailserver(string stremail)
{
 string strdomain=stremail.split('@')[1];
 processstartinfo info=new processstartinfo();
    info.useshellexecute=false;
 info.redirectstandardinput=true;
 info.redirectstandardoutput=true;
 info.filename="nslookup";
 info.createnowindow=true;
 info.arguments="-type=mx "+strdomain;
 process ns=process.start(info);
 streamreader sout=ns.standardoutput;
 regex reg=new regex("mail exchanger = (?<mailserver>[^\\s]+)");
 string strresponse="";
 while((strresponse=sout.readline())!=null){
      match amatch=reg.match(strresponse);
      if(reg.match(strresponse).success) return amatch.groups["mailserver"].value;
   
 }
 return null;
}

第二步,连接邮件服务器,确认服务器的可用性和用户是否存在

public int checkemail(string mailaddress)
{

 
 
  regex reg=new regex("^[a-za-z0-9_-]+@([a-za-z0-9-]+\\.){1,}(co.netedumizbizcncc)&#36;");

  if(!reg.ismatch(mailaddress) return 405;//email地址形式上就不对
 

  string mailserver=getmailserver(mailaddress);
  if(mailserver==null)
  {
     return 404; //邮件服务器探测错误
  }
  tcpclient tcpc=new tcpclient();
  tcpc.nodelay=true;
  tcpc.receivetimeout=3000;
  tcpc.sendtimeout=3000;
  try{
   tcpc.connect(mailserver,25);
  .networkstream s=tcpc.getstream();
   streamreader sr=new streamreader(s,encoding.default);
   streamwriter sw=new streamwriter(s,encoding.default);
   string strresponse="";
   string strtestfrom="brookes_luan@yahoo.com.cn";
   sw.writeline("helo "+mailserver);
   sw.writeline("mail from:<"+mailaddress+">");
   sw.writeline("rcpt to:<"+strtestfrom+">");
   strresponse=sr.readline();
   if(!strresponse.startswith("2")) return 403; //用户名有误
   sw.writeline("quit");
   return 200; //email地址检查无误
  
  }catch(exception ee)
  {
 return 403;//发生错误或邮件服务器不可达
  }
}

这个程序是根据smtp的基本过程实现的。与一个mail服务器连接发邮件的基本过程可能是这样的:

te.net mail.brookes.com 25

>>220 brookes.com<imail 8.02>

helo

>>250 mail.brookes.com

mail from:brookes@tsinghua.org.cn

>>250 ok

rcpt to:me@brookes.com

>>250 ok its for me@brookes.com

data

>>ok.send it ;end with <crlf>.<crlf>

soem data.

>>250 message queued

quit

>>221 goodbye.


灰色部分代码是一个常规的email地址检查方法,检查地址形式上的有效性。

程序用到了system.io,system.net.sockets,system.diagnostics命名空间,通过checkmail(mailaddress)调用。

说明:

1.这种方法可以进一步检查email地址的有效性,比只从形式上验证有了很大的进步。对于需要通过email地址进行注册信息验证、发送密码等应用,可以更进一步保证有效;

2.由于email服务器的多样和可配置性,因此次程序并不能保证结果的普遍适用;

3.对于一些大的邮件服务器,通常具有较强的反垃圾邮件功能,对于此类探测可能会作出反应,因此不适合于大量的地址探测。比如,我在探测过程中就发现了163.com服务器停止对次进行响应。


 


关键字 本文所属关键字

相关 与本文相关文章

分类 所有文章关键字导航

源码编程相关

Java   Asp   PHP   .Net   XML   C/C++   CGI   VB   Jsp   J2ee   J2se   J2me   EJB   Servlet   Tomcat   Resin   Struts   Weblogic   Eclipse   ANT   GUI   JMS   Web servise   IDEA   Webphere   Hibernate   Spring   Jboss   Applet   Swing   Socket   Javamail   Perl   Ajax   P2P   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons