當前位置:學問君>學習教育>論文寫作>

基於ESMTP的電子郵件發送程序的設計與實現

學問君 人氣:1.5W

摘 要:本文以爲開發平臺,利用Socket套接宇編程,實現了基於ESMTP的郵件發送程序。文中深入講解了ESMTP的原理及電子郵件發送程序的設計與實現方法。

基於ESMTP的電子郵件發送程序的設計與實現

關鍵詞:ESMTP,電子郵件,發送程序,,Socke

一、引言

隨着Intemet/Intranet的迅猛發展,電子郵件(E—Mail)已成爲因特網上非常流行、非常方便的通信方式。但是,隨之而來的是大量的廣告郵件和垃圾郵件的泛濫,爲應對這種情況,許多E—Mail服務商和ISP將它們的SMTP系統升級成了ESMTP系統。

本文采用微軟最新的。NET技術,以爲開發平臺,利用Socket套接字編程,開發了基於ESMTP協議的郵件發送程序,這裏將對相關原理及具體設計進行討論。

二、郵件傳輸協議

P簡介所謂ESMTP(Extended SMTP),即擴展的簡單郵件傳輸協議,是郵件服務器系統爲了限制非本系統的用戶利用本系統散發垃圾郵件等不當行爲而開設的一項安全認證服務。在ESMTP服務器上,發送郵件需要對用戶的身份進行驗證。它與傳統的SMTP方式相比,多了一道用戶身份驗證手續,此外,其郵件發送過程與傳統的SMTP方式一致。

P的執行過程ESMTP的執行,首先要發送命令建立一個可靠的有序數據流傳輸通道(TCP連接),然後客戶機向服務器發送其它命令,然後根據服務器回送的.響應決定下一步操作,並最終實現郵件的傳送。整個郵件發送過程就是兩者之間進行資訊交換的過程。

一般地,郵件發送過程將依次發送如下命令並得到響應(如表1)(以163爲例):

三、程序實現我們以爲平臺,透過Socket套接字編程序來實現郵件發送功能。

1.命名空間本文中主要使用了2個命名空間及2個類。

(1)ets命名空間ets命名空間爲需要嚴密控制同絡訪問的開發人員提供了Windows Sockets接口的託管實現。其中,定義了Socket類可用於實現發送郵件。該類的常用成員有。:

① 構造函數 Socket構造函數:用於初始化Socket類的新實例。

⑦ 方法

(2)命名空間命名空間爲多種協議提供了編程接口。

(3)其他類et類:用於數據類型轉換;ding類:表示數據編碼:

2.程序設計爲減少程序書寫量,可在視窗類之前使用以下語句導人命名空間及其中的類:

Imports System etsImports mports dingImports ert這樣,就可以直接弓I用其中的成員了。

另外,視窗類中還要初始化Socket類:

Public MySocket As New Socket一(Add ressFam rNetwork,一)L 程序介面設計其中,7個文字方塊的Name屬性從上到下依次爲:SMTPServ.

el“ UserAccount UserPassword SenderAddress、ReceiverAddress EMailSubject、EmailContent。2個按鈕的Name屬性依次爲:Send-Mail、QuitForm。

(2)發送電子郵件程序程序中,首先把要發送的數據(包括郵件內容和命令)存儲在變量SendData中,然後調用自訂的MySender函數發送出去:

. rivate Sub SendMall_』=lick(ByVal sender As System.

Object,ByVal e As tArgs)Handles Send-Mall ClickDIm SendData As String, HostEndPoint As IPEndPoint,HostAddress As I PAdd ressTryHostAddress=lve(SMTPServer,Text)。AddressList(0)HOstEndPOint = New I PEndPoint(HostAddress,25)連接服務器ect(HostEndPoint)Catch ex As ExceptionMsgBox( 連接失敗 ):GoTo QuitSendEnd TryIf Not W ait( 220 )Then GoTo QuitSend建立會話連接SendData = SendData = tring(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())+vbCrLfMySender(SendData)If Not W ait( 334 )Then GoTo QuitSend驗證用戶密碼SendData = TOBase64Strinq(ASCI1.

GetBytes(Use ))+vbC rLfMySender(SendData)If Not W ait( 235 )Then GoTo QuitSend發件人地址SendData = MAlL FROM: +SenderAdd + vbCrLfMySender(SendData)If Not W ait( 250 )Then GoTo QuitSend收件人地址SendData = RCPT TO: +ReceiverAdd + vbC rLfMySender(SendData)If Not Wait《 250 )Then GoTo QuitSend請求發送數據SendData = DATA vbCrLfMySender(SendData)If Not Wait《 354 )Then GoTo QuitSend顯示發件人地址SendData = F rOm: + + vbCrLf加上收件人地址SendData = SendData + To: +ReceiverAdd + vbCrLf加上主題SendData =SendData + Subject: + 4-vbCrLf加上郵件正文SendData = SendData + EMailContent Text加上郵件結束符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: 關閉down(SocketShutdown.

Receive)e(】

End Sub(3)自訂函數①數據發送程序程序會等待,直到Socket處於可寫狀態時,則將數據發送出去。

Public Function MySender《ByVaI Data As String)Dim MyW riteBufer As Byte 1)MyW riteBuffer= ASC GetBytes《Data)lf (一1,SelectMode.

SelectW rite)《MyW riteBuffer)End Function②等待應答函數程序最多等待5O秒,直到Socket處於可讀狀態時,則讀取數據,並與期待的應答碼相比較。

Public Function W ait l ByVal ResDOnseCOde As String) AsBooleanDim MyReadBufer(1 024)As ByteDim TotalStr As StringDim PreThreeW ord As ive《MyReadBuffer)If 《50000,一ctRead)ive《MvReadBuffer)TotaIStr= tring lMyReadBufer)PreTh reeWord=tring(0 3)If PreThreeW ord <> ResDOnseCOde ThenRetu rn FalseRetu rn TrueEnd Function

四、幾點說明(1)關於ESMTP中繼服務器設定目前,絕大多數郵件服務器都支援ESMTP,但是有些服務器僅支援透過Web頁面發送郵件,而不支援這種客戶端程序發送郵件。本文程序在測試發送成功。

(2)關於程序的完整性本文利用Socket編程實現基於ESMTP的郵件發送功能,重在講解ESMTP的原理、執行過程,以及Socket的程序設計方法 因此,程序力求精簡。故尚有須補充之處:

①錯誤處理。比如:未對郵件地址輸入錯誤進行處理。

②提示資訊。比如:缺乏郵件發送進度提示。

在實用程序中,這些都是必需的,但由於篇幅所限,故在本文的郵件發送程序中將這部分省去,讀者可自行補充完整。

五、結束語

隨着電子郵件的普及,垃圾郵件等危害服務器正常運轉的行爲也日益增多,因此,絕大多數服務器均採用ESMTP進行用戶身份認證。同時,也就需要客戶端軟件能夠完成身份認證工作。本文在中利用套接字編程實現了此功能。