当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > 通过探测邮件服务器进行Email地址有效性检验

ASP.NET
Asp.net利用JQuery弹出层加载数据代码
asp.net dataview做无限极分类的又一用法
asp.net ckeditor编辑器的使用方法
告别ADO.NET实现应用系统无缝切换的烦恼(总结篇)
asp.net 实现动态显示当前时间(不用javascript不考虑开销)
.net动态显示当前时间(客户端javascript)
asp.net 结合YUI 3.0小示例
asp.net 取消缓存相关问题说明
asp.net 计划任务管理程序实现,多线程任务加载
ASP.NET 跨页面传值方法
asp.net中url地址传送中文参数时的两种解决方案
Asp.net 菜单控件简洁版
asp.net jQuery Ajax用户登录功能的实现
asp.net SharpZipLib的压缩与解压问题
asp.net url重写后页面回传问题
asp.net与Discuz!NT整合集成实例教程
Discuz!NT 3与asp.net 整合的实例教程
测试控制台使用方法
.net 动态标题实现方法
asp.net *.ashx类型的文件使用说明

ASP.NET 中的 通过探测邮件服务器进行Email地址有效性检验


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-23   浏览: 215 ::
收藏到网摘: n/a

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

Email地址包括两个部分:用户名和邮件服务器。因此,检验邮件地址可以分为两步进行:首先检验邮件服务器,然后检验用户名。

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

//通过nslookup程序查询MX记录,获取域名对应的mail服务器
publicstringgetMailServer(stringstrEmail)
{
stringstrDomain=strEmail.Split('@')[1];
ProcessStartInfoinfo=newProcessStartInfo();
info.UseShellExecute=false;
info.RedirectStandardInput=true;
info.RedirectStandardOutput=true;
info.FileName="nslookup";
info.CreateNoWindow=true;
info.Arguments="-type=mx"+strDomain;
Processns=Process.Start(info);
StreamReadersout=ns.StandardOutput;
Regexreg=newRegex("mailexchanger=(?<mailServer>[^\\s]+)");
stringstrResponse="";
while((strResponse=sout.ReadLine())!=null){
Matchamatch=reg.Match(strResponse);
if(reg.Match(strResponse).Success)returnamatch.Groups["mailServer"].Value;

}
returnnull;
}

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


publicintcheckEmail(stringmailAddress)
{
Regexreg=newRegex("^[a-zA-Z0-9_-]+@([a-zA-Z0-9-]+\\.){1,}(com|net|edu|miz|biz|cn|cc)$");
if(!reg.IsMatch(mailAddress)return405;//Email地址形式上就不对
stringmailServer=getMailServer(mailAddress);
if(mailServer==null)
{
return404;//邮件服务器探测错误
}
TcpClienttcpc=newTcpClient();
tcpc.NoDelay=true;
tcpc.ReceiveTimeout=3000;
tcpc.SendTimeout=3000;
try{
tcpc.Connect(mailServer,25);
NetworkStreams=tcpc.GetStream();
StreamReadersr=newStreamReader(s,Encoding.Default);
StreamWritersw=newStreamWriter(s,Encoding.Default);
stringstrResponse="";
stringstrTestFrom="[email protected]";
sw.WriteLine("helo"+mailServer);
sw.WriteLine("mailfrom:<"+mailAddress+">");
sw.WriteLine("rcptto:<"+strTestFrom+">");
strResponse=sr.ReadLine();
if(!strResponse.StartsWith("2"))return403;//用户名有误
sw.WriteLine("quit");
return200;//Email地址检查无误
}catch(Exceptionee)
{
return403;//发生错误或邮件服务器不可达
}
}

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


telnetmail.brookes.com25
>>220brookes.com<IMail8.02>
HELO
>>250mail.brookes.com
MAILFROM:[email protected]
>>250Ok
RCPTTO:[email protected]
>>[email protected]
DATA
>>ok.sendit;endwith<CRLF>.<CRLF>
soemdata.
>>250messagequeued
QUIT
>>221Goodbye.

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

程序用到了System.IO,System.Net.Sockets,System.Diagnostics命名空间,通过checkMail(mailAddress)调用。

说明:

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

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

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