Private Function GetMailServer(ByVal sDomain As String) As String Dim info As New ProcessStartInfo() Dim ns As Process '調用Windows的nslookup命令,查找郵件服務器 info.UseShellExecute = False info.RedirectStandardInput = True info.RedirectStandardOutput = True info.FileName = "nslookup" info.CreateNoWindow = True '查找類型為MX。關于nslookup的詳細說明,請參見 'Windows幫助 info.Arguments = "-type=MX " + sDomain.ToUpper.Trim '啟動一個進行執行Windows的nslookup命令() ns = Process.Start(info) Dim sout As StreamReader sout = ns.StandardOutput ' 利用正則表達式找出nslookup命令輸出結果中的郵件服務器信息 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
Public Function CheckEmail(ByVal sEmail As String) As Long
Dim oStream As NetworkStream Dim sFrom As String '發件人 Dim sTo As String '收件人 Dim sResponse As String '郵件服務器的應答 Dim Remote_Addr As String '發件人的域名 Dim mserver As String '郵件服務器 Dim sText As String()
sTo = "<" + sEmail + ">" ' 從郵件地址分離出帳戶名和域名 sText = sEmail.Split(CType("@", Char)) ' 查找該域的郵件服務器 mserver = GetMailServer(sText(1)) 'mserver為空值表明查找郵件服務器失敗 If mserver = "" Then Return 4 Exit Function End If '發件人地址的域名必須合法 Remote_Addr = "sina.com.cn" sFrom = " '盡可能延遲創建對象的時間 Dim oConnection As New TcpClient() Try '超時時間 oConnection.SendTimeout = 3000 '連接SMTP端口 oConnection.Connect(mserver, 25) '收集郵件服務器的應答信息 oStream = oConnection.GetStream() sResponse = GetData(oStream) sResponse = SendData(oStream, "HELO " & Remote_Addr & vbCrLf) sResponse = SendData(oStream, "MAIL FROM: " & sFrom & vbCrLf) '如果對MAIL FROM指令有肯定的應答, '至少表明郵件地址的域名正確 If ValidResponse(sResponse) Then sResponse = SendData(oStream, "RCPT TO: " & sTo & vbCrLf) '如果對RCPT TO指令有肯定的應答 '表明郵件服務器已認可該地址 If ValidResponse(sResponse) Then Return 1 '郵件地址有效 Else Return 2 '只有域名有效 End If End If '結束與郵件服務器的會話 SendData(oStream, "QUIT" & vbCrLf) oConnection.Close() oStream = Nothing Catch Return 3 '錯誤! End Try End Function
'獲取服務器應答數據,并將其轉換為String Private Function GetData(ByRef oStream As NetworkStream) As String
Dim bResponse(1024) As Byte Dim sResponse As String
Dim lenStream As Integer = oStream.Read(bResponse, 0, 1024) If lenStream > 0 Then sResponse = Encoding.ASCII.GetString(bResponse, 0, 1024) End If Return sResponse End Function '向郵件服務器發送數據 Private Function SendData(ByRef oStream As NetworkStream, ByVal sToSend As String) As String Dim sResponse As String '將String轉換成Byte數組 Dim bArray() As Byte = Encoding.ASCII.GetBytes(sToSend.ToCharArray) '發送數據 oStream.Write(bArray, 0, bArray.Length()) sResponse = GetData(oStream) '返回應答 Return sResponse End Function
'服務器是否返回肯定的回答? Private Function ValidResponse(ByVal sResult As String) As Boolean Dim bResult As Boolean Dim iFirst As Integer If sResult.Length > 1 Then iFirst = CType(sResult.Substring(0, 1), Integer) '如果服務器返回應答的第一個字符小于'3' '我們認為服務器已認可剛才的操作 If iFirst < 3 Then bResult = True End If Return bResult End Function