摘要:該文首先介紹了Internet有關服務,接著對各種郵件協議族以及域名系統進行了論述,然后研究了Windows的服務器編程模型。將SMTP協議、POP3協議以及MIME結合起來開發郵件收發服務器。
關鍵詞:電子郵件;SMTP;POP3
中圖分類號:TP393文獻標識碼:A文章編號:1009-3044(2008)35-2298-04
The Design and Implementation of Email Server based on WinSock
SUN Gen-qin1, HU Jing-Li2
(1. Gannan Normal University, Ganzhou 341000, China; 2. Science and Technology College of NCHU,Nanchang 330034,China)
Abstract: This paper firstly shows the services about the Internet, and then gives an introduction to the several of email protocol and the domain system, and at last studies the programming models of windows severs. Unifying the SMTP protocol, the POP3 protocol and MIME to develop the receiving and sending server of mails.
Key words: Email; SMTP; POP3
1 引言
電子郵件是Internet上最為廣泛的一種服務。它方便使用,發送,閱讀,答復和管理方便,而且速度快,成本低。因此,電子郵件發展比較快,技術較以前有了很大發展。郵件報文格式發展到多用途Internet郵件擴展(MIME)格式,這使得現在的電子郵件能不僅允許你郵遞簡單的文本文件,還可以傳遞二進制數據,圖形圖像,音頻文件,視頻文件等。在另一方面,郵件協議也得到完善,由SMTP發展到ESMTP,增加郵件的加密,使得郵件傳送更為安全,高效。因此,電子郵件非常適用想進行快速信息處理以提高工作效率的現代企業。
2 TCP/IP協議組族
目前,在Internet廣泛采用的協議是TCP/IP協議族。TCP/IP, 是一組不同層次上的多個協議的組合。TCP/IP通常被認為是一個四層協議系統,如圖1所示。每一層負責不同的功能:
2.1 鏈路層
鏈路層有時也稱作數據鏈路層或網絡接口層,通常包括操作系統中的設備驅動程序和計算機中對應的網絡接口卡。它們一起處理與電纜(或其他任何傳輸媒介)的物理接口細節。
2.2 網絡層
網絡層有時也稱作互聯網層,處理分組在網絡中的活動,例如分組的選路。在TCP/IP協議族中,網絡層協議包括IP協議(網際協議),ICMP協議(Internet互聯網控制報文協議),以及IGMP協議(Internet組管理協議)。
2.3 運輸層
運輸層主要為兩臺主機上的應用程序提供端到端的通信。在TCP/IP協議族中,有兩個互不相同的傳輸協議: TCP(傳輸控制協議)和UDP(用戶數據報協議)。TCP為兩臺主機提供高可靠性的數據通信。UDP則為應用層提供一種非常簡單的服務。它只是把稱作數據報的分組從一臺主機發送到另一臺主機,但并不保證該數據報能到達另一端。任何必需的可靠性必須由應用層來提供。這兩種運輸層協議分別在不同的應用程序中有不同的用途。
2.4 應用層
應用層負責處理特定的應用程序細節。幾乎各種不同的TCP/IP實現都會提供這些通用的應用程序:如:Telnet、FTP和e-mail等。
3 Internet電子郵件系統
Internet電子郵件系統一般是由輸出隊列,輸出隊列,客戶處理,服務器處理以及接收郵件的郵箱組成的。其基本構成元素示意圖如圖2所示。
目前,許多機構都采用中繼系統,修改的Internet電子郵件系統如圖3所示。
在此系統中,在發送方和接收方之間有4個MTA。發送方主機上的本地MTA只把郵件交給它自己的中繼MTA(該中繼MTA可能在該機構的域中有一個mailhost的主機名)。這個通信就在該機構的本地互聯網上用SMTP。然后,發送方機構的中繼MTA就在Internet上把郵件發送到接收方機構的中繼MTA上,而這個中繼MTA就通過與接收方主機上的本地MTA通信,把郵件交給接收方主機。盡管可能存在其他協議,但這個例子中所有MTA均使用SMTP協議。
4 基于WinSock的郵件服務器
郵件服務器系統在VC++軟件開發平臺上實現,支持POP3、IMAP4、SMTP等國際標準郵件協議,是一款簡單實用的郵件服務器。整個系統具有高伸縮性、可靠性和可用性,為適應用戶需要特別提供一套系統中同時支持中、用戶界面功能簡單,滿足局域郵件收發的需求,用戶管理需求以及信件管理需求。
4.1 WinSock的概念
將Winsock細分為兩種組件:Client Sock和Server Sock,它們分別作為客戶端和服務器端的組件。通過這兩種組件之間的通信,再加上輔助的應用程序代碼,就可以實現一個簡單的通信程序。當然,如果你想在客戶端程序中再引入Server Sock的話,那么客戶端程序就可以充當服務器了,可以對其他的客戶端程序的請求進行響應。
如果正在編寫服務器端程序,就必須設置Server Sock組件的Port屬性。設置此參數主要是因為在同一臺計算機上可能運行著多個服務器程序,而它們可能總在不停地接受來自于遠程客戶端程序的連接請求。也可以設置Service屬性,它指示了Server Sock所提供的服務類型,比如:FTP、HTTP等,然后設置Active屬性為True。
如果正在編寫客戶端程序,則設置Client Server組件的屬性就多一些。Port屬性應設置成和服務器端的Port屬性值一致,另外Host的屬性必須正確設置,它是一個只讀屬性,在設計時不可用。Host指示了客戶程序所要連接的遠程服務器的主機名。也可以設置Address屬性,也就是遠程主機的IP地址。
4.2 郵件服務器的概念
郵件服務器提供了郵件系統的基本結構,包括郵件傳輸、郵件分發、郵件存儲等功能,以確保郵件能夠發送到Internet網絡中的任意地方。能基本實現各類信號的傳送、接收和存貯功能,不只局限于信件中傳遞,還可以用來傳遞文件、聲音及圖形圖像等不同類型的信息。
4.3 郵件服務器的功能
a) POP3郵件收取功能
POP3(Post office Protocol 3)L4 是TCP/IP網絡經常使用的郵政協議標準的最新版本.POP3協議允許客戶通過暫時的TCP/IP連接,從POP主機上取得電子郵件.POP協議最大的優點是不需要與網絡保持不問斷的連接,就可收取電子郵件。在默認情況自下,POP3的端口號是llO,其工作流程分為下面幾步:
1) 客戶機發出請求,請求和服務器連接;
2) POP3服務器應答,連接建立;
3) 客戶機和服務器交互命令/應答和數據;
4 )結束連接。
b) SMTP郵件發送功能
該系統可設置SMTP發信認證,有效防止垃圾郵件;發件人身份驗證支持由RF C2554、RFC2222和RFC 1995定義的發件人身份驗證功能,方便用戶通過客戶端軟件發送郵件。
信件管理功能:日常大量的電子郵件是需要管理的,對于個人來說工作量還好完成,但企業面臨的問題就嚴重了,眾多員工的往來信件需要解決空間、安全、歸檔、備份等等問題。
c) 郵件服務器的性能參數:郵件服務器的主要性能參數應當包括:SMTP發信效率、POP3收信效率、郵件服務器消息轉發效率等等。影響郵件服務器使用的重要因素:網絡帶寬的影響、操作系統的影響、郵件設計技術的影響、用戶配置水平的影響。
5 Windows下的服務器設計
在Windows操作系統中,服務器軟件有三種技術可以并發處理來自多個客戶機的服務器請求:多線程,消息驅動和循環處理。它們都有一些各自的特點:多線程編程最直接;消息驅動和循環處理只需要一個線程,節省了多線程間上下文切換的CPU開銷;消息驅動是Windows操作系統所特有的。因而更適合Windows下應用程序編寫的特點。但在循環處理的服務程序中,為了響應客戶機的請求,代碼使用異步接收和發送數據的辦法把長的傳輸間隔分成足夠短的間隔,這樣就破壞了程序自然的邏輯順序,整個代碼看起來會很凌亂,消息驅動的服務程序結構雖保證了程序的邏輯順序,但消息就像精靈一樣,根本無法預知她什么時候會突然地冒出來,因而很難確切地知道代碼實際運行的次序。Windows的多任務調度技術使得服務器可以給每個已連接的客戶機創建一個線程。獨立地處理請求和應答。這樣,開發復雜的并發式TCP服務器程序就變得容易了。一個處理客戶機請求程序的線程在收到完整的請求前能夠一直保持阻塞狀態,而不必擔心會妨礙對其他客戶機的處理。在收到請求后阻塞調用返回后,線程接著分析請求和應答,完畢后,線程或繼續接收下一個請求或直接退出。多線程并發服務器和客戶機交互的程序結構如圖4所示。
和其它搶占式的多線程操作系統一樣,32位的Windows操作系統提供了多任務的管理。這樣,服務器程序能夠為請求服務器的客戶機建立一個或多個任務線程,以便同時處理。
6 郵件服務器系統的主要模塊
6.1 概述
該郵件服務系統遵照SMTP協議,ESMTP協議,POP3協議,MIME協議。采用多線程并發技術,用戶驗證處理。其主要功能有:發送郵件,收郵件,用戶驗證并轉發郵件,郵局信件服務,用戶信件管理。
6.2 發送郵件模塊
該模塊的函數模塊為SendEmail,遵照SMTP協議和Internet郵件系統,整個模塊所需的類型為:
函數接口參數類型CemailMessage結構,它的定義如下:
typedef struct CemailMessage
{CString strEmailFrom; //起始郵件地址
CString strEmailTo;//目的郵件地址
CString strEmailBody;//郵件報文
};
郵件交換記錄的報文報頭的C語言描述如下:
typedef struct tagDNSHEADER
{USHORT id;//標識
unsigned short parameter;//參數
unsigned short questin_number;//問題數
unsigned short anwser_number;//答案數
unsigned short manager_number;//管理機構數
unsigned short accesory_info_number;//附加信息數
} DNSHEADER;
報文的問題單元的C語言描述如下:
typedef struct tagDNSQUESTION
{unsigned short query_type;
unsigned short query_class;
} DNSQUESTION;
整個函數模塊流程如圖5所示。
其中在郵件報文的發送SendEmailMsg函數中,若郵件目的地址非法,則必須進死信處理(DoDeadLetter)。
6.3 接收郵件模塊
該模塊函數為ReceiveMail,遵照SMTP協議。這個模塊主要實現SMTP基本會話協議和郵件的存放。回話中,主要要進行必要接收用戶名驗證。其部分流程如圖6所示。
6.4 用戶驗證并轉發郵件模塊
該模塊主要實現用戶的委托郵件發送,但必須進行用戶名和密碼的驗證,遵照的ESMTP協議。因為通常用戶名和密碼采用BASE64碼傳送,所模塊必須實現BASE64的解碼函數(IsRegisted)。
6.5 郵局信件服務模塊
該模塊實現了郵件的離線郵局服務。實現POP3協議的基本命令。
6.6 用戶信件管理模塊
對服務器來說,用戶的郵件管理顯得很重要。在該模塊中,對用戶的信件采用了以txt和eml為基本格式,兩層模式管理結構。以一個名為USER1為例,如圖7所示。
當USER1收到一個郵件時,服務器在USER1的文件夾下,以收到該信件的時間為文件名登記在USER1.txt中,同時,建立20001009103410.eml來保存郵件。
7 小結
通過對各種郵件協議的研究,了解各種協議的概念和作用,對其標識有一定的掌握,該系統實現了各種協議的基本功能。該系統基本實現郵件的收發,信件管理,用戶管理等基本功能,完成預期所要達到的目標。
參考文獻:
[1] 寇從芝, 張紅英. 基于Intranet的郵件服務器功能開發[J]. 計算機與現代化, 2004,9:55-56.
[2] 鄭瀾, 吉國力. J2EE平臺上郵件服務器的實現[J]. 廈門大學學報, 2005,44(B06):255-257.
[3] 俞盛. 電子郵件協議淺析[J]. 程序員, 2003,10:63-66.