- 相關(guān)推薦
基于ESMTP的電子郵件發(fā)送程序的設計與實(shí)現
摘 要:本文以VB.NET為開(kāi)發(fā)平臺,利用Socket套接宇編程,實(shí)現了基于ESMTP的郵件發(fā)送程序。文中深入講解了ESMTP的原理及電子郵件發(fā)送程序的設計與實(shí)現方法。
關(guān)鍵詞:ESMTP,電子郵件,發(fā)送程序,VB.NET,Socke
一、引言
隨著(zhù)Intemet/Intranet的迅猛發(fā)展,電子郵件(E—Mail)已成為因特網(wǎng)上非常流行、非常方便的通信方式。但是,隨之而來(lái)的是大量的廣告郵件和垃圾郵件的泛濫,為應對這種情況,許多E—Mail服務(wù)商和ISP將它們的SMTP系統升級成了ESMTP系統。
本文采用微軟最新的。NET技術(shù),以VB.NET為開(kāi)發(fā)平臺,利用Socket套接字編程,開(kāi)發(fā)了基于ESMTP協(xié)議的郵件發(fā)送程序,這里將對相關(guān)原理及具體設計進(jìn)行討論。
二、郵件傳輸協(xié)議
1.ESMTP簡(jiǎn)介所謂ESMTP(Extended SMTP),即擴展的簡(jiǎn)單郵件傳輸協(xié)議,是郵件服務(wù)器系統為了限制非本系統的用戶(hù)利用本系統散發(fā)垃圾郵件等不當行為而開(kāi)設的一項安全認證服務(wù)。在ESMTP服務(wù)器上,發(fā)送郵件需要對用戶(hù)的身份進(jìn)行驗證。它與傳統的SMTP方式相比,多了一道用戶(hù)身份驗證手續,此外,其郵件發(fā)送過(guò)程與傳統的SMTP方式一致。
2.ESMTP的運行過(guò)程ESMTP的運行,首先要發(fā)送命令建立一個(gè)可靠的有序數據流傳輸通道(TCP連接),然后客戶(hù)機向服務(wù)器發(fā)送其它命令,然后根據服務(wù)器回送的響應決定下一步操作,并最終實(shí)現郵件的傳送。整個(gè)郵件發(fā)送過(guò)程就是兩者之間進(jìn)行信息交換的過(guò)程。
一般地,郵件發(fā)送過(guò)程將依次發(fā)送如下命令并得到響應(如表1)(以163為例):
三、程序實(shí)現我們以VB.NET為平臺,通過(guò)Socket套接字編程序來(lái)實(shí)現郵件發(fā)送功能。
1.命名空間本文中主要使用了2個(gè)命名空間及2個(gè)類(lèi)。
(1)System.Net.Sockets命名空間System.Net.Sockets命名空間為需要嚴密控制同絡(luò )訪(fǎng)問(wèn)的開(kāi)發(fā)人員提供了Windows Sockets接口的托管實(shí)現。其中,定義了Socket類(lèi)可用于實(shí)現發(fā)送郵件。該類(lèi)的常用成員有。:
、 構造函數 Socket構造函數:用于初始化Socket類(lèi)的新實(shí)例。
、 方法
(2)System.Net命名空間System.Net命名空間為多種協(xié)議提供了編程接口。
(3)其他類(lèi)System.Convet類(lèi):用于數據類(lèi)型轉換;System.Text.Encoding類(lèi):表示數據編碼:
2.程序設計為減少程序書(shū)寫(xiě)量,可在窗口類(lèi)之前使用以下語(yǔ)句導人命名空間及其中的類(lèi):
Imports System Net.SocketsImports System.NetImports System.Text.EncodingImports System.Convert這樣,就可以直接弓I用其中的成員了。
另外,窗口類(lèi)中還要初始化Socket類(lèi):
Public MySocket As New Socket一(Add ressFam y.InterNetwork,一SocketType.Stream.ProtocolType.Tcp)L 程序界面設計其中,7個(gè)文本框的Name屬性從上到下依次為:SMTPServ.
el“ UserAccount UserPassword SenderAddress、ReceiverAddress EMailSubject、EmailContent。2個(gè)按鈕的Name屬性依次為:Send-Mail、QuitForm。
(2)發(fā)送電子郵件程序程序中,首先把要發(fā)送的數據(包括郵件內容和命令)存儲在變量SendData中,然后調用自定義的MySender函數發(fā)送出去:
. rivate Sub SendMall_』=lick(ByVal sender As System.
Object,ByVal e As System.EventArgs)Handles Send-Mall ClickDIm SendData As String, HostEndPoint As IPEndPoint,HostAddress As I PAdd ressTryHostAddress=Dns.Resolve(SMTPServer,Text)。AddressList(0)HOstEndPOint = New I PEndPoint(HostAddress,25)連接服務(wù)器MySocket.Connect(HostEndPoint)Catch ex As ExceptionMsgBox( 連接失敗 ):GoTo QuitSendEnd TryIf Not W ait( 220 )Then GoTo QuitSend建立會(huì )話(huà)連接SendData = SMTPServer.TextSendData = SendData.Substring(SendData Index0f( . ) + 1)SendData = EHLO + SendData + vbC rLfMySende r(SendData 1If Not Wait( 250 )Then GoTo QuitSend要求身份驗證SendData = AUTH LOGIN + vbCrLfMySender(SendData) .
If Not W ait( 334 )Then GoTo QuitSend驗證用戶(hù)帳號SendData = TOBase64Strinq(ASCIIGetBytes(UserAccount.Text))+vbCrLfMySender(SendData)If Not W ait( 334 )Then GoTo QuitSend驗證用戶(hù)密碼SendData = TOBase64Strinq(ASCI1.
GetBytes(Use rPassword.Text))+vbC rLfMySender(SendData)If Not W ait( 235 )Then GoTo QuitSend發(fā)件人地址SendData = MAlL FROM: +SenderAdd ress.Text + vbCrLfMySender(SendData)If Not W ait( 250 )Then GoTo QuitSend收件人地址SendData = RCPT TO: +ReceiverAdd ress.Text + vbC rLfMySender(SendData)If Not Wait《 250 )Then GoTo QuitSend請求發(fā)送數據SendData = DATA vbCrLfMySender(SendData)If Not Wait《 354 )Then GoTo QuitSend顯示發(fā)件人地址SendData = F rOm: +SenderAddress.Text + vbCrLf加上收件人地址SendData = SendData + To: +ReceiverAdd ress.Text + vbCrLf加上主題SendData =SendData + Subject: +EMailSubject.Text 4-vbCrLf加上郵件正文SendData = SendData + EMailContent Text加上郵件結束符SendData=vbCrLf+SendData + . + vbCrLfMySender《SendData)If Not W ait《 250 )Then GoTo QuitSend退出會(huì )話(huà)連接SendData = QUIT vbCrLfMySender(SendData)If Not W aitl 221 )Then GoTo QuitSendQuitSend: 關(guān)閉MySocket.Shutdown(SocketShutdown.
Receive)MySocket.Close(】
End Sub(3)自定義函數①數據發(fā)送程序程序會(huì )等待,直到Socket處于可寫(xiě)狀態(tài)時(shí),則將數據發(fā)送出去。
Public Function MySender《ByVaI Data As String)Dim MyW riteBufer As Byte 1)MyW riteBuffer= ASC GetBytes《Data)lf MySocket.Poll(一1,SelectMode.
SelectW rite)ThenMySocket.Send《MyW riteBuffer)End Function②等待應答函數程序最多等待5O秒,直到Socket處于可讀狀態(tài)時(shí),則讀取數據,并與期待的應答碼相比較。
Public Function W ait l ByVal ResDOnseCOde As String) AsBooleanDim MyReadBufer(1 024)As ByteDim TotalStr As StringDim PreThreeW ord As StringMySocket.Receive《MyReadBuffer)If MySocket.Poll《50000,一SelectMode.SelectRead)ThenMySocket.Receive《MvReadBuffer)TotaIStr= ASCI1.GetString lMyReadBufer)PreTh reeWord=TotalStr.Substring(0 3)If PreThreeW ord <> ResDOnseCOde ThenRetu rn FalseRetu rn TrueEnd Function
四、幾點(diǎn)說(shuō)明(1)關(guān)于ESMTP中繼服務(wù)器設置目前,絕大多數郵件服務(wù)器都支持ESMTP,但是有些服務(wù)器僅支持通過(guò)Web頁(yè)面發(fā)送郵件,而不支持這種客戶(hù)端程序發(fā)送郵件。本文程序在smtp.163.eom測試發(fā)送成功。
(2)關(guān)于程序的完整性本文利用Socket編程實(shí)現基于ESMTP的郵件發(fā)送功能,重在講解ESMTP的原理、運行過(guò)程,以及Socket的程序設計方法 因此,程序力求精簡(jiǎn)。故尚有須補充之處:
、馘e誤處理。比如:未對郵件地址輸入錯誤進(jìn)行處理。
、谔崾拘畔。比如:缺乏郵件發(fā)送進(jìn)度提示。
在實(shí)用程序中,這些都是必需的,但由于篇幅所限,故在本文的郵件發(fā)送程序中將這部分省去,讀者可自行補充完整。
五、結束語(yǔ)
隨著(zhù)電子郵件的普及,垃圾郵件等危害服務(wù)器正常運轉的行為也日益增多,因此,絕大多數服務(wù)器均采用ESMTP進(jìn)行用戶(hù)身份認證。同時(shí),也就需要客戶(hù)端軟件能夠完成身份認證工作。本文在VB.NET中利用套接字編程實(shí)現了此功能。
【基于ESMTP的電子郵件發(fā)送程序的設計與實(shí)現】相關(guān)文章:
基于Vxworks實(shí)時(shí)操作系統的串口通信程序設計與實(shí)現03-18
基于PCI總線(xiàn)的CAN卡的設計與實(shí)現03-18
基于A(yíng)SP的網(wǎng)絡(luò )考試系統的設計與實(shí)現03-07
基于FPGA的TS over lP的設計與實(shí)現03-21