国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

VB.NET驗證郵件地址的合法性實現(xiàn)代碼

2024-07-10 13:25:02
字體:
供稿:網(wǎng)友
一、提出問題
  現(xiàn)在,對于用戶在Web頁面上或電話中給出的Email地址,我們越來越不敢肯定它是否真的有效。在今天這個垃圾郵件泛濫成災(zāi)的年代,人們完全有理由舍不得輕易透露Email地址。
  
  另一方面,對于通過正規(guī)途徑得到的郵件地址,當(dāng)我們將它用于合法的目的時,也常常要為郵件地址是否有效而煩惱,用戶可能有意或無意地寫錯地址,也可能由于長時間不訪問而導(dǎo)致郵箱失效。對于少量的郵件地址,也許可以手工驗證其合法性,例如發(fā)送測試email;但是,當(dāng)郵件地址的數(shù)量達到數(shù)萬甚至更多時,手工驗證就不可能了,必須用專門的工具或自己編寫程序自動執(zhí)行驗證。
  
  常規(guī)的驗證方法只從email地址的格式判斷其合法性,例如檢查它是否包含“@”和“.”符號。顯然,這種檢查是不充分的,郵件地址格式正確并不證明它一定有效。由于這個原因,一些網(wǎng)站采取了用email發(fā)送密碼、特殊資源的URL等辦法,或者要求用戶回復(fù)email,以此確保email地址的有效性。但是,這些辦法不見得任何時候都有效,例如,你可能不是從自己的網(wǎng)站上收集用戶email,而是通過第三者獲得。
  
  考慮到這些原因,驗證email地址合法性最根本的辦法是查詢郵件服務(wù)器。本文將給出完成這一任務(wù)的完整VB.NET代碼。
  
  二、郵件服務(wù)器之合法性
  對于任何郵件地址,判斷其合法性的第一步當(dāng)然是看看它的格式是否正確,例如是否包含“@”和“.”符號,這方面的資料很多,甚至還有現(xiàn)成的控件,所以本文不再贅述。我們的任務(wù)從判斷郵件地址的域是否合法開始,例如對于abc@sina.com.cn這個地址,首先判斷sina.com.cn的郵件服務(wù)器是否有效。
  
  每一個域有一個MX記錄,即郵件交換器(Mail Exchanger)記錄,它指向該域內(nèi)處理email的服務(wù)器,我們只要查詢DNS服務(wù)器即可獲得該信息。Windows本身帶來的nslookup命令非常適合于完成該任務(wù),例如,要查找sina.com.cn的郵件服務(wù)器,只需執(zhí)行nslookup -type=mx sina.com.cn,其中-type=MX表示要查找MX記錄,輸出結(jié)果如圖一所示。Windows的nslookup命令要安裝了TCP/IP協(xié)議后才可用,詳細說明可參見Windows幫助。
    

VB.NET驗證郵件地址的合法性實現(xiàn)代碼


  下面的GetMailServer函數(shù)封裝了調(diào)用Windows nslookup命令的操作,根據(jù)參數(shù)中指定的域名返回郵件服務(wù)器。
  
  Private Function GetMailServer(ByVal sDomain As String) As String
  Dim info As New ProcessStartInfo()
  Dim ns As Process
  '調(diào)用Windows的nslookup命令,查找郵件服務(wù)器
  info.UseShellExecute = False
  info.RedirectStandardInput = True
  info.RedirectStandardOutput = True
  info.FileName = "nslookup"
  info.CreateNoWindow = True
  '查找類型為MX。關(guān)于nslookup的詳細說明,請參見
  'Windows幫助
  info.Arguments = "-type=MX " + sDomain.ToUpper.Trim
  '啟動一個進行執(zhí)行Windows的nslookup命令()
  ns = Process.Start(info)
  Dim sout As StreamReader
  sout = ns.StandardOutput
  ' 利用正則表達式找出nslookup命令輸出結(jié)果中的郵件服務(wù)器信息
  Dim reg As Regex = New Regex("mail exchanger = (?[^///s]+)")
  Dim mailserver As String
  Dim response As String = ""
  Do While (sout.Peek() > -1)
  response = sout.ReadLine()
  Dim amatch As Match = reg.Match(response)
  If (amatch.Success) Then
  mailserver = amatch.Groups("server").Value
  Exit Do
  End If
  Loop
  Return mailserver
  End Function
  
  三、郵件地址之合法性
  只要郵件地址中指定的域合法,我們就可以連接郵件服務(wù)器,試著發(fā)送一個email。如果郵件服務(wù)器回答說該用戶非法或不存在,表明郵件地址無效。這一步的主要操作包括創(chuàng)建一個連接郵件服務(wù)器的Socket,然后按照SMTP郵件傳輸協(xié)議的要求與服務(wù)器通信,完成郵件發(fā)送操作。關(guān)于SMTP協(xié)議的詳細說明,有興趣的讀者可參見SMTP規(guī)范(RFC 821):。
  
  下面CheckEmail函數(shù)的輸入?yún)?shù)是一個郵件地址,函數(shù)的返回值表示該地址是否合法。該函數(shù)有兩個數(shù)值可隨意調(diào)整:在發(fā)送郵件的過程中,我們要向?qū)Ψ降泥]件服務(wù)器提供一個合法的域名以表明自己的身份,這里選擇的是sina.com.cn;根據(jù)網(wǎng)絡(luò)和對方郵件服務(wù)器的忙閑程度,響應(yīng)時間也會發(fā)生變化,這里選擇的等待時間是3秒。當(dāng)網(wǎng)絡(luò)或?qū)Ψ椒?wù)器非常忙時,減小等待時間會增加測試失敗的可能性。
  
  Public Function CheckEmail(ByVal sEmail As String) As Long
  
  Dim oStream As NetworkStream
  Dim sFrom As String '發(fā)件人
  Dim sTo As String '收件人
  Dim sResponse As String '郵件服務(wù)器的應(yīng)答
  Dim Remote_Addr As String '發(fā)件人的域名
  Dim mserver As String '郵件服務(wù)器
  Dim sText As String()
  
  sTo = "<" + sEmail + ">"
  ' 從郵件地址分離出帳戶名和域名
  sText = sEmail.Split(CType("@", Char))
  ' 查找該域的郵件服務(wù)器
  mserver = GetMailServer(sText(1))
  'mserver為空值表明查找郵件服務(wù)器失敗
  If mserver = "" Then
  Return 4
  Exit Function
  End If
  '發(fā)件人地址的域名必須合法
  Remote_Addr = "sina.com.cn"
  sFrom = "
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 两当县| 平遥县| 淮南市| 尖扎县| 岑巩县| 交城县| 泸西县| 青浦区| 全州县| 澄江县| 石渠县| 贡嘎县| 临武县| 天全县| 牡丹江市| 贵港市| 应用必备| 安龙县| 彰化市| 涪陵区| 原平市| 恩施市| 砚山县| 东辽县| 北票市| 海城市| 徐水县| 扎鲁特旗| 汶上县| 洛宁县| 大连市| 若尔盖县| 浠水县| 巴林左旗| 井研县| 朝阳县| 本溪| 江油市| 潞城市| 尚志市| 平阴县|