zoukankan      html  css  js  c++  java
  • C#验证Email是否真正存在,不是验证邮件格式,是邮件地址是否存在

    [转]C#验证Email是否真正存在,不是验证邮件格式,是邮件地址是否存在
     

    来源: http://community.csdn.net/Expert/topicview.asp?id=5412319

    在以往的编程中,比如编写用户的资料时,有时需要确认用户输入的Email是否真实有效,以前我们最多只能做到验证Email是否包含了某些特殊的字符,比如"@",".",".com"等,做到的只是判断了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); file://默认端口是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,一行是服务器的欢迎信息加版本信息。

    接下来就是按照上面所说的步骤来完成操作:

    file://写入HELO命令
    if(OperaStream(tcpc,"HELOhttp://www.webjx.com") != "250")
    {
    lblMsgShow.Text = "HELO 命令不能完成,本端口可能并非提供SMTP服务";
    OperaStream(tcpc,"QUIT");
    return;
    }
    file://写入Mail From命令
    if(OperaStream(tcpc,"MAIL FROM: web@webjx.com") != "250")
    {
    lblMsgShow.Text = "MAIL命令不能完成,SMTP服务需要验证";
    OperaStream(tcpc,"QUIT");
    return;
    }
    file://写入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 + "\r\n"; file://加入换行符
    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帐号,这种做法是服务器防止外人使用服务发送垃圾邮件

    http://bbs.csai.cn/bbs/view.asp?Id={67F53C96-8D2E-450E-BD69-67A68A8CE90E}

  • 相关阅读:
    使用CustomValidate自定义验证控件
    C#中金额的大小写转换
    Andriod出错之Unable to build: the file dx.jar was not loaded from the SDK folder!
    VC 编写的打字练习
    机房工作笔记Ping只有单向通
    web服务协同学习笔记(1)
    Dll 学习3 将MDI子窗口封装在DLL中
    机房工作学习文件共享
    Andriod出错之Failed to find an AVD compatible with target 'Android 2.2'
    Andriod出错之wrapper was not properly loaded first
  • 原文地址:https://www.cnblogs.com/csj007523/p/1249574.html
Copyright © 2011-2022 走看看