帝国软件
  设为首页 加入收藏 关于我们
 
解密帝国网站管理系统
栏 目:
 
您的位置:首页 > 技术文档 > ASP.NET编程 >
验证Email是否真正存在(上)
作者:飞刀 发布时间:2005-03-12 来源:ASPCOOL
     在以往的编程中,比如编写用户的资料时,有时需要确认用户输入的Email是否真实有效,以前我们最多只能做到验证Email是否包含了某些特殊的字符,比如"@",".",".com"等,做到的只是判断了Email的合法性,证明用户填写的Email格式是正确的,但是这个Email是否真正的存在于网络中,则没有办法。
  
  本文,飞刀将教大家如何验证此Email存在性。。当然不是凭空想像出来的:)
  
  首先需要大家了解一下SMTP协议。
  
  1.SMTP是工作在两种情况下:一是电子邮件从客户机传输到服务器;二是从某一个服务器传输到另一个
    服务器
  2.SMTP是个请求/响应协议,命令和响应都是基于ASCII文本,并以CR和LF符结束。响应包括一个表示返 
    回状态的三位数字代码
  3.SMTP在TCP协议25号端口监听连接请求
  4.连接和发送过程
  
  SMTP协议说复杂也不复杂(明明带有“简单”这个词嘛),说简单如果你懂得Sock。不过现在只是我们利用的就是第一条中说的,从客户机传输到服务器,当我们向一台服务器发送邮件时,邮件服务器会首先验证邮件发送地址是否真的存在于本服务器上。
  
  操作的步骤如下:
  
  连接服务器的25端口(如果没有邮件服务,连了也是白连)
  发送helo问候
  发送mail from命令,如果返回250表示正确可以,连接本服务器,否则则表示服务器需要发送人验证。
  发送rcpt to命令,如果返回250表示则Email存在
  发送quit命令,退出连接
  下面我们就来操作这个流程:
  
  首先看看页面构架:
  
  <b>普通的Email验证</b>
  <form runat="server">
  <table boder="#6699FF">
  <tr><td colspan="2" align="center" ><asp:Label id="lblMsgShow" ForeColor="red" runat="server" /></td></tr>
  <tr><td>需要验证的Email地址:</td><td><asp:TextBox id="tbEmail" runat="server" /></td></tr>
  <tr><td>邮件SMTP服务器:</td><td><asp:TextBox id="tbServer" runat="server" /></td></tr>
  <tr><td>SMTP端口:</td><td><asp:TextBox id="tbPort" Text="25" runat="server" /></td></tr>
  <tr><td colspan="2" ><asp:Button id="btnValidate" Text="验证" OnClick="Validate_Email" runat="server" /></td></tr>
  </table>
  <b>验证过程展示:</b>
  <asp:Panel id="ShowPro" runat="server" />
  </form>
  
  Button控件的点击将激发Valiate_Email事件,所有主程序操作全是在这个事件中完成,下面就来具体讲解本事件处理中的代码。
  
  关于TCP连接的东东,我就不想再重复了。。请大家自己去看我以前的文章:
  
  string strEmail,strServer;
  int intPort;
  strEmail = tbEmail.Text;
  strServer = tbServer.Text;
  intPort = Int32.Parse(tbPort.Text); //默认端口是25
  
  TcpClient tcpc = new TcpClient();
  
  服务器等信息来自于用户输入,建立与服务器25端口的连接。
  
  try
  {
  tcpc.Connect(strServer,intPort);
  StreamReader sr = new StreamReader(tcpc.GetStream(),Encoding.Default);
  sr.ReadLine();
  ...
  }
  
  请注意上面代码中两点:一在beta2中不能再通过判断返回值的方法来判断建立的连接是否成功,只能通过捕捉错误例外的方法判断;二在打开连接,使用Stream读取时,必须有一个sr.ReadLine,一行是服务器的欢迎信息加版本信息。
  
  接下来就是按照上面所说的步骤来完成操作:
  
  //写入HELO命令
  if(OperaStream(tcpc,"HELO www.aspcn.com") != "250")
  {
  lblMsgShow.Text = "HELO 命令不能完成,本端口可能并非提供SMTP服务";
  OperaStream(tcpc,"QUIT");
  return;
  }
  //写入Mail From命令
  if(OperaStream(tcpc,"MAIL FROM: my@my.com") != "250")
  {
  lblMsgShow.Text = "MAIL命令不能完成,SMTP服务需要验证";
  OperaStream(tcpc,"QUIT");
  return;
  }
  //写入RCPT命令,这是关键的一步,后面的参数便是查询的Email的地址
  if(OperaStream(tcpc,"RCPT TO: "+strEmail) != "250")
  {
  lblMsgShow.Text = strEmail + "此邮件地址并非有效";
  OperaStream(tcpc,"QUIT");
  return;
  }
  else
  {
  lblMsgShow.Text = strEmail + "是一个合法有效的邮件地址";
  OperaStream(tcpc,"QUIT");
  return;
  }
  
  Helo命令后面的主机名,在某些邮件服务器中不需要比如Imail,但是还是写上好,当然你也可以乱写骗服务器,不过一般来说服务器都能检查出来。
  
  其中OperaStrem是我们是自定义的函数,用于操作连接流:
  
  public string OperaStream(TcpClient tcpc,string strCmd)
  {
  Stream TcpStream;
  strCmd = strCmd + "rn"; //加入换行符
  TcpStream = tcpc.GetStream();
  byte[] bWrite = Encoding.Default.GetBytes(strCmd.ToCharArray());
  TcpStream.Write(bWrite,0,bWrite.Length);
  StreamReader sr = new StreamReader(tcpc.GetStream(),Encoding.Default);
  string rl = sr.ReadLine();
  string sp = rl.Substring(0,3);
  ShowPro.Controls.Add(new LiteralControl("执行命令:<font color=red>"+strCmd+"</font><br>返回数据:"+rl+"<br>"));
  return sp;
  }
  
  此函数的返回值是流的信息代码,用于判断操作是否成功,250表示成功,550表示只能适用于本地邮件,也就是说发件人必须是该服务器上的用户,比如在连接smtp.163.net,就必须拥有一个真实有效的163.net帐号,这种做法是服务器防止外人使用服务发送垃圾邮件,具体操作我们下一节再说。
  
  到此如果返回值是250,一切大功告成,下图是测试feidao@aspcn.com(我的邮件)的测试结果。
  
  
  
  如果运气不好碰上了需要验证的服务器,那就有麻烦了;)还必须有合法的帐号,验证时还需要您对Base4编码有所了解。。。如果您有足够的耐性及知识,请您看下一节。
  
  转自http://www.aspcn.com
  

  
评论】【加入收藏夹】【 】【打印】【关闭
※ 相关链接
 ·关于IBuySpy里面用户权限验证方面  (2005-03-12)
 ·EJB 最佳实践:数据验证出现在什  (2005-03-12)
 ·用PHP实现验证码功能  (2005-03-11)
 ·浅谈PHP+MYSQL身份验证的方法  (2005-03-11)

   栏目导行
  PHP编程
  ASP编程
  ASP.NET编程
  JAVA编程
   站点最新
·致合作伙伴的欢迎信
·媒体报道
·帝国软件合作伙伴计划协议
·放眼未来 帝国近期将有重大举措!
·PHPWind6.3.2版通行证发布
·帝国备份王2008版正式发布
·帝国备份王2008版发布
·phpcms2007转帝国CMS5.0程序发布
·dedecms5.1转帝国CMS5.0程序发布
·帝国网站管理系统V5.0商业购买说明
   类别最新
·ASP.NET中为DataGrid添加合计字段
·.text urlRewrite介绍
·利用 ASP.NET 的内置功能抵御 Web
·ASP.NET Cache
·用 WebClient.UploadData 方法 上载
·ASP.NET 程序设计-序
·什么是客户端/伺服端(Client/Serve
·因特网应用程序的开发
·网页的种类
·.NET Framework-Microsoft Visual
 
关于帝国 | 广告服务 | 联系我们 | 程序开发 | 网站地图 | 留言板 帝国网站管理系统