SMTP判断邮箱是否存在 检查email地址是否真实存在

SMTP判断邮箱是否存在,检查email地址是否真实存在

判断一个Email是否存在的类

作者:mlemos

来源:www.fastboard.org

<?

/*

*  email_validation.php

*

*

*/

class  email_validation_class

{

//var  $email_regular_expression="^([a-z0-9_]  |//-  |//.)[email protected](([a-z0-9_]  |//-)+//.)+[a-z]{2,4}$";

var  $timeout=0;

var  $localhost="";

var  $localuser="";

Function  GetLine($connection)

{

for($line="";;)

{

if(feof($connection))

return(0);

$line.=fgets($connection,100);

$length=strlen($line);

if($length>=2  &&  substr($line,$length-2,2)=="/r/n")

return(substr($line,0,$length-2));

}

}

Function  PutLine($connection,$line)

{

return(fputs($connection,"$line/r/n"));

}

Function  ValidateEmailAddress($email)

{

//return(eregi($this->email_regular_expression,$email)!=0);

return(eregi("^([a-z0-9_]  |//-  |//.)[email protected](([a-z0-9_]  |//-)+//.)+[a-z]{2,4}$",$email)!=0);

}

Function  ValidateEmailHost($email,$hosts=0)

{

if(!$this->ValidateEmailAddress($email))

return(0);

$user=strtok($email,"@");

$domain=strtok("");

if(GetMXRR($domain,&$hosts,&$weights))

{

$mxhosts=array();

for($host=0;$host<count($hosts);$host++)

$mxhosts[$weights[$host]]=$hosts[$host];

KSort($mxhosts);

for(Reset($mxhosts),$host=0;$host<count($mxhosts);Next($mxhosts),$host++)

$hosts[$host]=$mxhosts[Key($mxhosts)];

}

else

{

$hosts=array();

if(strcmp(@gethostbyname($domain),$domain)!=0)

$hosts[]=$domain;

}

return(count($hosts)!=0);

}

Function  VerifyResultLines($connection,$code)

{

while(($line=$this->GetLine($connection)))

{

if(!strcmp(strtok($line,"  "),$code))

return(1);

if(strcmp(strtok($line,"-"),$code))

return(0);

}

return(-1);

}

Function  ValidateEmailBox($email)

{

if(!$this->ValidateEmailHost($email,&$hosts))

return(0);

if(!strcmp($localhost=$this->localhost,"")
 &&  !strcmp($localhost=getenv("SERVER_NAME"),"")  &&
 !strcmp($localhost=getenv("HOST"),""))

$localhost="localhost";

if(!strcmp($localuser=$this->localuser,"")
 &&  !strcmp($localuser=getenv("USERNAME"),"")  &&
 !strcmp($localuser=getenv("USER"),""))

$localuser="root";

for($host=0;$host<count($hosts);$host++)

{

if(($connection=($this->timeout
 ?
 fsockopen($hosts[$host],25,&$errno,&$error,$this->timeout)
 :  fsockopen($hosts[$host],25))))

{

if($this->VerifyResultLines($connection,"220")>0  &&
 $this->PutLine($connection,"HELO  $localhost")  &&
 $this->VerifyResultLines($connection,"250")>0  &&
 $this->PutLine($connection,"MAIL  FROM:
 <[email protected]$localhost>")  &&
 $this->VerifyResultLines($connection,"250")>0  &&
 $this->PutLine($connection,"RCPT  TO:  <$email>")  &&
 ($result=$this->VerifyResultLines($connection,"250"))>=0)

{

fclose($connection);

return($result);

}

fclose($connection);

}

}

return(-1);

}

};

?>

=============================================================================

-----------------------------------------------------------------------------

应用范例:

=============================================================================

echo  "<center><br/>检查电子邮件地址的正确性:<br/>";

$newmail  =  "[email protected]";

require("email_validation.php3");

$validator=new  email_validation_class;

$validator->timeout=10;

if(IsSet($newemail)  &&  strcmp($newemail,""))

{

if(($result=$validator->ValidateEmailBox($newemail))<0)

{

echo  "不能确定您的信箱是否正确.  您的信箱离这里太远了吧?<br/>";

return;

}

else

{

if(!$result)

{

echo  "您输入的信箱地址是不正确的!  :)<br/>";

return;

}

else

echo  "邮箱合法!<br/>";

}

}

原理解释:

在以往的编程中,比如编写用户的资料时,有时需要确认用户输入的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: [email protected]") != "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帐号,这种做法是服务器防止外人使用服务发送垃圾邮件

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

原文地址:https://www.cnblogs.com/swdhywhd/p/10310717.html

时间: 2024-08-27 13:21:57

SMTP判断邮箱是否存在 检查email地址是否真实存在的相关文章

JavaScript 检查 email 地址的正则表达式

JavaScript 检查 email 地址的正则表达式?1.代码(1)<html><head><title>Checking an email address - Version 01</title><script type="text/javascript" language="javascript"><!-- //function IsMatchingAddress(str){    var m

android 判断 手机号码、邮编、Email邮箱、是否正确

java-正则表达式判断手机号 要更加准确的匹配手机号码只匹配11位数字是不够的,比如说就没有以144开始的号码段, 故先要整清楚现在已经开放了多少个号码段,国家号码段分配如下: 移动:134.135.136.137.138.139.150.151.157(TD).158.159.187.188 联通:130.131.132.152.155.156.185.186 电信:133.153.180.189.(1349卫通) 那么现在就可以正则匹配测试了, public static boolean

前端笔试题:拍扁多维数组、提取URL中的参数变成对象、实现string的trim()函数、判断Email地址、16进制颜色转rgb格式

(1)拍扁数组 这是一个著名互联网公司今天的前端笔试题:多维数组维数不定,如[2,4,1,[2,3,4,[1,2],5,3],3,8]拍扁为[2,4,1,2,3,4,1,2,5,3,3,8].维数不定,应该要用递归: 答案: function flatten(arr){ var arrLength=arr.length; for(var i=0;i<arrLength;i++){ if(arr[i].constructor==Array){ arr.splice(i,1,flatten(arr[

5313 [JL]判断邮箱地址 升级版

5313 [JL]判断邮箱地址 升级版 时间限制: 1 s 空间限制: 1000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 正确的邮箱地址格式要求: 1.格式:用户名@服务器名.后缀域名” 2.用户名.服务器名.后缀域名均由字母.英文与下划线组成 输入一个邮箱地址判断它是不是合法的邮箱地址. 输入格式: 1.不会出现多节域名(比如:[email protected] 这种不会出现) 2.不会出现中文字符 输入描述 Input Description

如何验证 Email 地址:SMTP 协议入门教程

Email 是最常用的用户识别手段. 开发者常常需要验证邮箱的真实性.一般的方法是,注册时向该邮箱发出一封验证邮件,要求用户点击邮件里面的链接. 但是很多时候(比如要搞邮件营销时),拿到的是成千上万现成的 Email 地址,不可能通过回复确认真实性,这时该怎么办呢? 答案就是使用 SMTP 协议.本文将介绍如何通过该协议验证邮箱的真假. 另外,结尾处还有一则移动端 H5 开发的培训消息,欢迎关注. 一.SMTP 协议简介 SMTP 是"简单邮件传输协议"(Simple Mail Tra

根据Email地址跳转到相应的邮箱登录页面 (转)

//跳转到指定的邮箱登录页面 $(".btn_actemail").click(function () { var uurl = $(".hide_email").val(); uurl = gotoEmail(uurl); if (uurl != "") { $(".toopen").attr("href", "http://"+uurl); $(".toopen"

JavaScript判断E-mail地址是否合法

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">编写自定义的JavaScript函数checkEmail(),在该函数中首先判断E-mail文本框是否为空,然后在应用正则表达式判断E-mail地址是否合法,如果不合法提示用户</span> <span style="font-family: Arial, H

Powershell删除Exchange用户邮箱中多余的电子邮件地址

今天闲暇无事,看到杜飞老师在51cto博客上的一篇文章,关于写Exchange删除用户邮箱中多余的电子邮件地址的博客地址,博客链接:http://dufei.blog.51cto.com/382644/1590097,继续翻阅网上同类的文章,又找到一篇徐鹏徐大师在csdn上的一篇博客,也是同样的主题,博客链接:http://blog.csdn.net/fogyisland2000/article/details/7805291 ,徐大师说的这个程序我找了下官方链接,已经停止更新了,最新的版本是2

判断 邮箱格式是否正确

练习:判断邮箱格式是否正确1.有且只能有一个@2.不能以@开头[email protected]之后至少有一个.[email protected]和.不能靠在一起5.不能以.结尾 1 Console.Write("请输入邮箱地址:"); 2 string m = Console.ReadLine(); 3 if (m.IndexOf("@") == m.LastIndexOf("@")) 4 { 5 if (m.IndexOf("@&q