SMTP郵件服務(wù)器實驗報告及源代碼.docx_第1頁
SMTP郵件服務(wù)器實驗報告及源代碼.docx_第2頁
SMTP郵件服務(wù)器實驗報告及源代碼.docx_第3頁
SMTP郵件服務(wù)器實驗報告及源代碼.docx_第4頁
SMTP郵件服務(wù)器實驗報告及源代碼.docx_第5頁
已閱讀5頁,還剩8頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

SMTP郵件服務(wù)器實驗1. 實驗內(nèi)容和實驗環(huán)境描述實驗任務(wù):使用Socket API編寫一個SMTP郵件服務(wù)器程序?qū)嶒瀮?nèi)容:1)作為SMTP服務(wù)器,接收郵件客戶端程序的TCP連接請求,接收SMTP命令和郵件數(shù)據(jù),將郵件保存在文件中; 2)作為SMTP客戶端,建立到實際郵件服務(wù)器的TCP連接,發(fā)送SMTP命令,將保存的郵件發(fā)送給實際郵件服務(wù)器; 3)提供郵件差錯報告:將實際郵件服務(wù)器的差錯報告轉(zhuǎn)發(fā)給郵件客戶端軟件; 4)支持一封郵件多個接收者,要求接收者屬于不同的域(如、163.com、,); 5)提供發(fā)件人和收件人Email地址格式檢查功能,例如下列郵件地址是錯誤的:chengli,chengli,, . 。實驗環(huán)境:Microsoft Visual Studio 20102. 軟件設(shè)計(1) 數(shù)據(jù)結(jié)構(gòu):char mail_from4096;/存發(fā)件地址char rcpt_to54096;/存收件地址char data4096;/存Datachar imf4096;/存郵件標(biāo)準(zhǔn)格式WORD A;/加載套接字庫WSADATA B;/儲存調(diào)用WSAStartup函數(shù)返回的Windows Sockets初始化信息int err;/報錯標(biāo)志SOCKET sockSrv;/創(chuàng)建用于監(jiān)聽客戶端的套接字SOCKADDR_IN addrSrv;/作為服務(wù)器端的socket地址char recvBuf4096=;/接收客戶端SMTP指令(2) 模塊結(jié)構(gòu):1main();/服務(wù)器端,用于從客戶端接收儲存郵件2main_clicenet(SOCKET s);/客戶端,用于將收到的郵件轉(zhuǎn)發(fā)到郵件服務(wù)器,同時將郵件服務(wù)器的錯誤報告通過SOCKET s轉(zhuǎn)發(fā)給客戶端3 ValidEmail(char *addr);/收發(fā)件地址(addr)合法性監(jiān)測(3) 算法流程:畫出流程圖,描述算法的主要流程。Main()Load Windows Sockets;創(chuàng)建用于監(jiān)聽的socket;綁定socket和sockaddr;將socket設(shè)為監(jiān)聽模式;While(1)請求隊列非空則抽取第一個鏈接建立連接;打開郵件儲存文件;Send:220 recv:EHLO ; Send:250 OK recv:MAIL FROM: T 發(fā) 件 地址 合 法 FSend:550 Invalid User ; continueSend:250 OK recv: RCPT TO:;檢查合法性While(recv!=DATA)recv: RCPT TO:;檢查合法性Send:250 OKRecv:DATAsend:354 Start mail input;end with .rn recv: DATA fragment, .bytesSend:250 recv:IMF; send 250 recv: . Send:QUIT調(diào)用客戶端程序關(guān)閉套接字關(guān)閉文件指針釋放分配的套接字資源(4) 主要功能模塊的實現(xiàn)要點1main();/服務(wù)器端,用于從客戶端接收儲存郵件實現(xiàn)要點:與客戶端建立連接,根據(jù)SMTP協(xié)議標(biāo)準(zhǔn)進行通信。2main_clicenet(SOCKET s);/客戶端,用于將收到的郵件轉(zhuǎn)發(fā)到郵件服務(wù)器,同時將郵件服務(wù)器的錯誤報告通過SOCKET s轉(zhuǎn)發(fā)給客戶端實現(xiàn)要點:與服務(wù)器端建立連接,根據(jù)SMTP協(xié)議標(biāo)準(zhǔn)進行通信。3 ValidEmail(char *addr);/收發(fā)件地址(addr)合法性監(jiān)測實現(xiàn)要點:根據(jù)標(biāo)準(zhǔn)email地址格式進行合法性監(jiān)測3 實驗結(jié)果演示及分析(1) 對于你所實現(xiàn)的功能,逐個進行測試,并將輸出截圖。普通郵件群發(fā): 1 2 34錯誤報告:12(2) 你的程序是否提供了差錯處理功能?可以對哪些差錯進行處理?1 將實際郵件服務(wù)器的差錯報告轉(zhuǎn)發(fā)給郵件客戶端軟件;2監(jiān)測收發(fā)件郵箱地址格式是否正確(3) 和課堂上學(xué)習(xí)的SMTP協(xié)議相比,你的程序是否完全按照協(xié)議來實現(xiàn),是否有不同之處?和實際的SMTP服務(wù)器相比,你的程序有哪些優(yōu)點和不足?不是。因為main函數(shù)無法從客戶端收取用戶名和密碼,故跳過AUTH LOGIN部分,直接開始MAILFROM:。優(yōu)點:代碼功能較為簡潔易懂。不足:未實現(xiàn)用戶合法性監(jiān)測。以及收發(fā)件郵箱地址是否實際存在。4 實驗總結(jié)和心得體會描述你在調(diào)試過程中都遇到了哪些問題和解決的過程。(1) 完成本次實驗的實際上機調(diào)試時間是多少? 14hours。(2) 編程工具方面遇到了哪些問題?包括Windows環(huán)境和VC軟件的安裝問題。沒。(3) 編程語言方面遇到了哪些問題?包括C語言使用和對C語言操控能力上的問題。涉及到Socket方面的函數(shù)由于初次接觸使用尚不熟練。(4) 協(xié)議方面遇到了哪些問題?包括協(xié)議機制的設(shè)計錯誤,發(fā)現(xiàn)協(xié)議死鎖,或者不能正確工作,協(xié)議參數(shù)的調(diào)整等問題。協(xié)議中提供的郵件域名解析指令被大部分郵件服務(wù)器屏蔽,只能通過其他函數(shù)編碼實現(xiàn)相應(yīng)功能。(5) 通過本次試驗,你認為SMTP協(xié)議有哪些不足?有何改進思路?功能較為基礎(chǔ),但擴展改進等已有SSL,X2.5等增強版本存在。(6) 總結(jié)本次實驗,你在C 語言方面,協(xié)議軟件方面,理論學(xué)習(xí)方面,軟件工程方面等哪些方面上有所提高?熟悉了C語言的編碼規(guī)范,通信協(xié)議的工作機制。5 源程序清單#pragma comment(lib,wsock32.lib) #include#include#include#includechar mail_from4096;char rcpt_to54096;char data4096;char imf4096;void main_Client(SOCKET);int ValidEmail(char*);void main()WORD A = MAKEWORD(1,1); /加載套接字庫WSADATA B; /儲存調(diào)用WSAStartup函數(shù)返回的Windows Sockets初始化信息int err;err=WSAStartup(A,&B); /根據(jù)A要求的版本初始化Winsock服務(wù)if(err!=0) / Tell the user that we couldnt find a useable / winsock.dll. return;if (LOBYTE(B.wVersion)!=1|HIBYTE(B.wVersion)!=1) WSACleanup( ); /檢查socket版本,不符合則釋放分配資源return;SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0); /創(chuàng)建用于監(jiān)聽客戶端的套接字SOCKADDR_IN addrSrv;/作為服務(wù)器端的socket地址addrSrv.sin_addr.S_un.S_addr=inet_addr();/ Internet address addrSrv.sin_family=AF_INET;addrSrv.sin_port=htons(25); /服務(wù)器端端口號bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR); /綁定套接字listen(sockSrv,5); /將套接字設(shè)為監(jiān)聽模式,準(zhǔn)備接受客戶請求SOCKADDR_IN addrClient; /客戶端地址int len=sizeof(SOCKADDR);char *sendBuf=220 LXs SMTP Readyrn,250 LXs server|250 mail|250 PIPELININGrn,250 OKrn,250 OKrn,354 Start mail input;end with .rn,250 OKrn,250 OKrn,QUITrn,550 Invalid Userrn; /發(fā)送標(biāo)示符char tempbuf14096=;while(1) /等待客戶請求SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len); /隊列非空則sockSrv抽取第一個鏈接,否則阻塞調(diào)用進程FILE *fp;fp=fopen(d:Universitymail.txt,w+); char recvBuf4096=; /接收客戶端SMTP指令memset(rcpt_to,0,sizeof(rcpt_to);send(sockConn,sendBuf0,strlen(sendBuf0),0); /向已經(jīng)連接的套接字sockConn發(fā)送連接建立信息:220recv(sockConn,recvBuf,sizeof(recvBuf),0); /接收數(shù)據(jù) EHLO acer-PCfprintf(fp,%sn,recvBuf); /將數(shù)據(jù)寫入文件memset(recvBuf,0,sizeof(recvBuf); /將recvBuf前4096個字節(jié)用字符0替換send(sockConn,sendBuf1,strlen(sendBuf1),0); / send:250 OKrecv(sockConn,recvBuf,sizeof(recvBuf),0); /recv:MAIL FROM:if(ValidEmail(recvBuf)send(sockConn,sendBuf8,strlen(sendBuf8),0);closesocket(sockConn); fclose(fp); continue; /send:550memcpy(mail_from,recvBuf,sizeof(recvBuf); fprintf(fp,%sn,recvBuf); memset(recvBuf,0,sizeof(recvBuf);send(sockConn,sendBuf2,strlen(sendBuf2),0); /send:250 OKrecv(sockConn,recvBuf,sizeof(recvBuf),0); /recv: RCPT TO:if(ValidEmail(recvBuf)send(sockConn,sendBuf8,strlen(sendBuf8),0);closesocket(sockConn); fclose(fp); continue; /send:550 memcpy(rcpt_to0,recvBuf,sizeof(recvBuf); fprintf(fp,%sn,recvBuf); memset(recvBuf,0,sizeof(recvBuf); send(sockConn,sendBuf2,strlen(sendBuf2),0); /send:250 OKrecv(sockConn,recvBuf,sizeof(recvBuf),0);/recv:?int i=1;strncpy(tempbuf1,recvBuf,4);while(strcmp(tempbuf1,RCPT)=0)&(i5)if(ValidEmail(recvBuf)send(sockConn,sendBuf8,strlen(sendBuf8),0);closesocket(sockConn); fclose(fp); continue;/send:550 memcpy(rcpt_toi,recvBuf,sizeof(recvBuf); fprintf(fp,%sn,recvBuf);memset(recvBuf,0,sizeof(recvBuf);send(sockConn,sendBuf2,strlen(sendBuf2),0); /send:250 OKrecv(sockConn,recvBuf,sizeof(recvBuf),0); /recv: RCPT TO:strncpy(tempbuf1,recvBuf,4);+i;fprintf(fp,%sn,recvBuf);memset(recvBuf,0,sizeof(recvBuf); send(sockConn,sendBuf4,strlen(sendBuf4),0);/send:354 Start mail input;end with .rnrecv(sockConn,recvBuf,sizeof(recvBuf),0); /recv:DATA fragment, .bytesmemcpy(data,recvBuf,sizeof(recvBuf); fprintf(fp,%sn,recvBuf); memset(recvBuf,0,sizeof(recvBuf); send(sockConn,sendBuf5,strlen(sendBuf5),0); /send:250 OKrecv(sockConn,recvBuf,sizeof(recvBuf),0); /recv:IMFmemcpy(imf,recvBuf,sizeof(recvBuf);fprintf(fp,%sn,recvBuf); memset(recvBuf,0,sizeof(recvBuf);send(sockConn,sendBuf6,strlen(sendBuf6),0); /send:250 OKrecv(sockConn,recvBuf,sizeof(recvBuf),0); /recv: . fprintf(fp,%sn,recvBuf);memset(recvBuf,0,sizeof(recvBuf);send(sockConn,sendBuf7,strlen(sendBuf7),0); /send:QUITfprintf(fp,%sn,recvBuf);main_Client(sockConn); /調(diào)用客戶端函數(shù)closesocket(sockConn); /關(guān)閉套接字fclose(fp); /關(guān)閉文件指針WSACleanup(); /釋放分配資源void main_Client(SOCKET sockCo)WORD A=MAKEWORD(1,1); WSADATA B; int err; err=WSAStartup(A,&B); if(err!=0)return; if(LOBYTE(B.wVersion)!=1|HIBYTE(B.wVersion)!=1)WSACleanup();return;SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0); SOCKADDR_IN addrClient; addrClient.sin_family = AF_INET; addrClient.sin_port = htons(25); struct hostent *host; /主機信息host = gethostbyname(); memcpy(&addrClient.sin_addr.S_un.S_addr,host-h_addr_list0,host-h_length); /將獲取的主機IP地址復(fù)制到客戶端網(wǎng)絡(luò)地址.32位無符號IPV4地址 connect(sockClient,(SOCKADDR*)&addrClient,sizeof(SOCKADDR); /連接套接字 char *SendBuf = EHLO rn, AUTH LOGINrn, Z3VhaWRhbzIyrn,/郵箱名的Base64編碼THVuYVhUSjkyMTAxNA=rn,/密碼的Base64編碼DATArn, rn.rn,QUIT; char arecvBuf4096 = ; char tempbuf3=;memset(tempbuf,0,sizeof(tempbuf); memset(arecvBuf, 0, sizeof(arecvBuf); /初始化arecvBufrecv(sockClient, arecvBuf, sizeof(arecvBuf), 0); /recv:220 OKmemset(arecvBuf, 0, sizeof(arecvBuf); send(sockClient, SendBuf0, strlen(SendBuf0), 0); /send:EHLO acer_PCrecv(sockClient, arecvBuf, sizeof(arecvBuf), 0); /recv:250 OKstrncpy(tempbuf,arecvBuf,3);if(strcmp(tempbuf,250)!=0)send(sockCo,arecvBuf,strlen(arecvBuf),0);memset(arecvBuf, 0, sizeof(arecvBuf); send(sockClient, SendBuf1, strlen(SendBuf1), 0); /send:AUTH LOGINrecv(sockClient, arecvBuf, sizeof(arecvBuf), 0); /recv:334strncpy(tempbuf,arecvBuf,3);if(strcmp(tempbuf,334)!=0)send(sockCo,arecvBuf,strlen(arecvBuf),0);memset(arecvBuf, 0, sizeof(arecvBuf); send(sockClient, SendBuf2, strlen(SendBuf2), 0); /send:Z3VhaWRhbzIyrecv(sockClient, arecvBuf, sizeof(arecvBuf), 0); /recv:334strncpy(tempbuf,arecvBuf,3);if(strcmp(tempbuf,334)!=0)send(sockCo,arecvBuf,strlen(arecvBuf),0);memset(arecvBuf, 0, sizeof(arecvBuf); send(sockClient, SendBuf3, strlen(SendBuf3), 0); /send:THVuYVhUSjkyMTAxNA=recv(sockClient, arecvBuf, sizeof(arecvBuf), 0); /rec:235strncpy(tempbuf,arecvBuf,3);if(strcmp(tempbuf,235)!=0)send(sockCo,arecvBuf,strlen(arecvBuf),0);memset(arecvBuf, 0, sizeof(arecvBuf); send(sockClient, mail_from, strlen(mail_from), 0); /send:MAIL FROM:recv(sockClient, arecvBuf, sizeof(arecvBuf), 0); /recv:250 OKstrncpy(tempbuf,arecvBuf,3);if(strcmp(tempbuf,250)!=0)send(sockCo,arecvBuf,strlen(arecvBuf),0);int i=0;while(rcpt_toi0!=0)&(i5)memset(arecvBuf, 0, sizeof(arecvBuf); send(sockClient, rcpt_toi, strlen(rcpt_toi), 0); /send:RCPT TO:recv(sockClient, arecvBuf, sizeof(arecvBuf), 0); /recv:250 OKstrncpy(tempbuf,arecvBuf,3);if(strcmp(tempbuf,250)!=0)send(sockCo,arecvBuf,strlen(arecvBuf),0);+i;memset(arecvBuf, 0, sizeof(arecvBuf); send(sockClient, SendBuf4, strlen(SendBuf4), 0); /send: DATArecv(sockClient, arecvBuf, sizeof(arecvBuf), 0); /recv:354strncpy(tempbuf,arecvBuf,3);if(strcmp(tempbuf,354)!=0)send(sockCo,arecvBuf,strlen(arecvBuf),0);memset(arecvBuf, 0, sizeof(arecvBuf); send(sockClient, data, strlen(data), 0); /send:DATA fragment, .bytesmemset(arecvBuf, 0, sizeof(arecvBuf); send(sockClient, imf, strlen(imf), 0); /send:imf fragmentmemset(arecvBuf, 0, sizeof(arecvBuf); send(sockClient, SendBuf5, strlen(SendBuf5), 0); /send: . recv(sockClient, arecvBuf, sizeof(arecvBuf), 0); /recv:250 OKstrncpy(tempbuf,arecvBuf,3);if(strcmp(tempbuf,250)!=0)send(sockCo,arecvBuf,strlen(arec

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論