- 相關(guān)推薦
基于ESMTP的電子郵件發(fā)送程序的設(shè)計與實現(xiàn)
摘 要:本文以VB.NET為開發(fā)平臺,利用Socket套接宇編程,實現(xiàn)了基于ESMTP的郵件發(fā)送程序。文中深入講解了ESMTP的原理及電子郵件發(fā)送程序的設(shè)計與實現(xiàn)方法。
關(guān)鍵詞:ESMTP,電子郵件,發(fā)送程序,VB.NET,Socke
一、引言
隨著Intemet/Intranet的迅猛發(fā)展,電子郵件(E—Mail)已成為因特網(wǎng)上非常流行、非常方便的通信方式。但是,隨之而來的是大量的廣告郵件和垃圾郵件的泛濫,為應(yīng)對這種情況,許多E—Mail服務(wù)商和ISP將它們的SMTP系統(tǒng)升級成了ESMTP系統(tǒng)。
本文采用微軟最新的。NET技術(shù),以VB.NET為開發(fā)平臺,利用Socket套接字編程,開發(fā)了基于ESMTP協(xié)議的郵件發(fā)送程序,這里將對相關(guān)原理及具體設(shè)計進行討論。
二、郵件傳輸協(xié)議
1.ESMTP簡介所謂ESMTP(Extended SMTP),即擴展的簡單郵件傳輸協(xié)議,是郵件服務(wù)器系統(tǒng)為了限制非本系統(tǒng)的用戶利用本系統(tǒng)散發(fā)垃圾郵件等不當(dāng)行為而開設(shè)的一項安全認證服務(wù)。在ESMTP服務(wù)器上,發(fā)送郵件需要對用戶的身份進行驗證。它與傳統(tǒng)的SMTP方式相比,多了一道用戶身份驗證手續(xù),此外,其郵件發(fā)送過程與傳統(tǒng)的SMTP方式一致。
2.ESMTP的運行過程ESMTP的運行,首先要發(fā)送命令建立一個可靠的有序數(shù)據(jù)流傳輸通道(TCP連接),然后客戶機向服務(wù)器發(fā)送其它命令,然后根據(jù)服務(wù)器回送的響應(yīng)決定下一步操作,并最終實現(xiàn)郵件的傳送。整個郵件發(fā)送過程就是兩者之間進行信息交換的過程。
一般地,郵件發(fā)送過程將依次發(fā)送如下命令并得到響應(yīng)(如表1)(以163為例):
三、程序?qū)崿F(xiàn)我們以VB.NET為平臺,通過Socket套接字編程序來實現(xiàn)郵件發(fā)送功能。
1.命名空間本文中主要使用了2個命名空間及2個類。
(1)System.Net.Sockets命名空間System.Net.Sockets命名空間為需要嚴密控制同絡(luò)訪問的開發(fā)人員提供了Windows Sockets接口的托管實現(xiàn)。其中,定義了Socket類可用于實現(xiàn)發(fā)送郵件。該類的常用成員有。:
、 構(gòu)造函數(shù) Socket構(gòu)造函數(shù):用于初始化Socket類的新實例。
、 方法
(2)System.Net命名空間System.Net命名空間為多種協(xié)議提供了編程接口。
(3)其他類System.Convet類:用于數(shù)據(jù)類型轉(zhuǎn)換;System.Text.Encoding類:表示數(shù)據(jù)編碼:
2.程序設(shè)計為減少程序書寫量,可在窗口類之前使用以下語句導(dǎo)人命名空間及其中的類:
Imports System Net.SocketsImports System.NetImports System.Text.EncodingImports System.Convert這樣,就可以直接弓I用其中的成員了。
另外,窗口類中還要初始化Socket類:
Public MySocket As New Socket一(Add ressFam y.InterNetwork,一SocketType.Stream.ProtocolType.Tcp)L 程序界面設(shè)計其中,7個文本框的Name屬性從上到下依次為:SMTPServ.
el“ UserAccount UserPassword SenderAddress、ReceiverAddress EMailSubject、EmailContent。2個按鈕的Name屬性依次為:Send-Mail、QuitForm。
(2)發(fā)送電子郵件程序程序中,首先把要發(fā)送的數(shù)據(jù)(包括郵件內(nèi)容和命令)存儲在變量SendData中,然后調(diào)用自定義的MySender函數(shù)發(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建立會話連接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驗證用戶帳號SendData = TOBase64Strinq(ASCIIGetBytes(UserAccount.Text))+vbCrLfMySender(SendData)If Not W ait( 334 )Then GoTo QuitSend驗證用戶密碼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ā)送數(shù)據(jù)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加上郵件結(jié)束符SendData=vbCrLf+SendData + . + vbCrLfMySender《SendData)If Not W ait《 250 )Then GoTo QuitSend退出會話連接SendData = QUIT vbCrLfMySender(SendData)If Not W aitl 221 )Then GoTo QuitSendQuitSend: 關(guān)閉MySocket.Shutdown(SocketShutdown.
Receive)MySocket.Close(】
End Sub(3)自定義函數(shù)①數(shù)據(jù)發(fā)送程序程序會等待,直到Socket處于可寫狀態(tài)時,則將數(shù)據(jù)發(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②等待應(yīng)答函數(shù)程序最多等待5O秒,直到Socket處于可讀狀態(tài)時,則讀取數(shù)據(jù),并與期待的應(yīng)答碼相比較。
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
四、幾點說明(1)關(guān)于ESMTP中繼服務(wù)器設(shè)置目前,絕大多數(shù)郵件服務(wù)器都支持ESMTP,但是有些服務(wù)器僅支持通過Web頁面發(fā)送郵件,而不支持這種客戶端程序發(fā)送郵件。本文程序在smtp.163.eom測試發(fā)送成功。
(2)關(guān)于程序的完整性本文利用Socket編程實現(xiàn)基于ESMTP的郵件發(fā)送功能,重在講解ESMTP的原理、運行過程,以及Socket的程序設(shè)計方法 因此,程序力求精簡。故尚有須補充之處:
、馘e誤處理。比如:未對郵件地址輸入錯誤進行處理。
、谔崾拘畔。比如:缺乏郵件發(fā)送進度提示。
在實用程序中,這些都是必需的,但由于篇幅所限,故在本文的郵件發(fā)送程序中將這部分省去,讀者可自行補充完整。
五、結(jié)束語
隨著電子郵件的普及,垃圾郵件等危害服務(wù)器正常運轉(zhuǎn)的行為也日益增多,因此,絕大多數(shù)服務(wù)器均采用ESMTP進行用戶身份認證。同時,也就需要客戶端軟件能夠完成身份認證工作。本文在VB.NET中利用套接字編程實現(xiàn)了此功能。
【基于ESMTP的電子郵件發(fā)送程序的設(shè)計與實現(xiàn)】相關(guān)文章:
基于Vxworks實時操作系統(tǒng)的串口通信程序設(shè)計與實現(xiàn)03-18
基于PQRM的PACS系統(tǒng)設(shè)計與實現(xiàn)03-07
基于Perl的DoS工具設(shè)計與實現(xiàn)03-10
基于PCI總線的CAN卡的設(shè)計與實現(xiàn)03-18
基于MVC模式的BBS系統(tǒng)設(shè)計與實現(xiàn)03-08
基于ASP的網(wǎng)絡(luò)考試系統(tǒng)的設(shè)計與實現(xiàn)03-07
基于FPGA的TS over lP的設(shè)計與實現(xiàn)03-21