




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
實(shí)驗(yàn)郵件客戶(hù)端實(shí)現(xiàn)1316-30-何珊珊[實(shí)驗(yàn)名稱(chēng)]:郵件客戶(hù)端實(shí)現(xiàn)[實(shí)驗(yàn)器材]:右與因特網(wǎng)連接的計(jì)算機(jī)網(wǎng)絡(luò)系統(tǒng);右主機(jī)操作系統(tǒng)為Windows7;右VC6[實(shí)驗(yàn)內(nèi)容]::要求學(xué)生利用已有的套接字常識(shí)使用SMTP和POP3的任一種協(xié)議,實(shí)現(xiàn)對(duì)于特定郵件服務(wù)器(mail.163)的發(fā)送郵件功能。[實(shí)驗(yàn)步驟]:在VC6中搭建工程,因?yàn)镾MTP中用戶(hù)名和密碼都要經(jīng)過(guò)64位編碼的處理,所以工程中除了對(duì)SMTP的編程外還需要一個(gè)64為編碼的轉(zhuǎn)換函數(shù)。以下是代碼:MailTest.cpp:#include"stdafx.h"#include"SMTP.h"intmain(intargc,char*argv[]){charto[256];chartitle[256];charbody[1024];charstrServer[128];charstrUser[128];charstrPsw[128];charstrSndMail[128];CSMTPsmtp;smtp.Initialize();/*charto[]="heshanshan2512@";chartitle[]="test";charbody[]="heshanshan09211595";charstrServer[]="SMTP.163.com";charstrUser[]="shan_shan2512";charstrPsw[]="shanshan091756";charstrSndMail[]="shan_shan2512@163.com";*/ //提示輸入的信息printf("strServer:");scanf("%s",strServer);printf("strSndMail:");scanf("%s",strSndMail);printf("strUser:");scanf("%s",strUser);printf("strPsw:");scanf("%s",strPsw);printf("to:");scanf("%s",to);printf("title:");scanf("%s",title);printf("body:");scanf("%s",body);if(smtp.MailSend(to,title,body,strServer,strUser,strPsw,strSndMail)){printf("successful\n");//發(fā)送成功}else{printf("fail\n");//發(fā)送失敗}return0;}SMTP.h:#pragmaonce#include<string>#include"Base64.h"#include<Winsock2.h>#pragmacomment(lib,"Ws2_32")#include<windows.h>#include<time.h>usingnamespacestd;classCSMTP{public:CSMTP(void);~CSMTP(void);BOOLInitialize(void);BOOLMailSend(stringto,stringtitle,stringbody,stringstrServer,stringstrUser,stringstrPsw,stringstrSndMail);private:SOCKETm_socket;};SMTP.cpp:
#include"stdafx.h"#include"SMTP.h"#defineMAX_PACKET_SIZE1024CSMTP::CSMTP(void)//構(gòu)造函數(shù){m_socket=NULL;}CSMTP::~CSMTP()//析構(gòu)函數(shù)BOOLCSMTP::Initialize() //入口函數(shù){WORDwVersionRequested; //用WSAStartup函數(shù)加載套接字庫(kù),并進(jìn)行版本協(xié)商WSADATAwsaData;interr;wVersionRequested=MAKEWORD(1,1);err=WSAStartup(wVersionRequested,&wsaData);if(err!=0){returnFALSE;}if(LOBYTE(wsaData.wVersion)!=1||HIBYTE(wsaData.wVersion)!=1)WSACleanup();returnFALSE;}returnTRUE;}BOOLCSMTP::MailSend(stringto,stringtitle,stringbody,stringstrServer,stringstrUser,stringstrPsw,stringstrSndMail){sockaddr_inaddrSmtp; //配置服務(wù)端地址信息constchar*smtpServer=strServer.c_str();constchar*smtpUser=strUser.c_str();constchar*smtpPass=strPsw.c_str();constchar*senderMail=strSndMail.c_str();if(m_socket!二NULL) 〃判斷socket是否可用,若不可用重新創(chuàng)建{closesocket(m_socket);m_socket=NULL;if(m_socket==NULL){m_socket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);//創(chuàng)建一個(gè)客戶(hù)端的套接字}structin_addrin;hostent*hosts=gethostbyname(smtpServer);//域名轉(zhuǎn)換if(hosts!=NULL){memcpy((char**)&(in),hosts->h_addr,hosts->h_length)//把主機(jī)地址付給in}else{returnFALSE;}stringaddrc=inet_ntoa(in);//將網(wǎng)絡(luò)字節(jié)序轉(zhuǎn)換成應(yīng)用的格式addrSmtp.sin_family=AF_INET;//配置服務(wù)端地址信息addrSmtp.sin_addr.s_addr=in.S_un.S_addr;addrSmtp.sin_port=htons(25);//SMTP的端口號(hào)為25intret=0;ret=connect(m_socket,(LPSOCKADDR)&addrSmtp,sizeof(addrSmtp));//與服務(wù)端進(jìn)行連接if(ret==SOCKET_ERROR)//連接失敗{char*err=newchar[1024];sprintf(err,"連接失?。",GetLastError());printf("%s\n",err);returnFALSE;}chars[MAX_PACKET_SIZE];charr[MAX_PACKET_SIZE];memset((void*)s,0,MAX_PACKET_SIZE);memset((void*)r,0,MAX_PACKET_SIZE);intlen;stringresponse;//等待服務(wù)器回應(yīng)len=recv(m_socket,(char*)r,MAX_PACKET_SIZE,0);if(len)response=r;intposition=response.substr(0,3).compare("220");//判斷返回信息的前三個(gè)字符是否為220,如果是,表示連接服務(wù)器成功if(position==0){len=sprintf((char*)s,"helo%s\r\n",strUser.c_str());//將用戶(hù)名賦給s并發(fā)送給服務(wù)器len=send(m_socket,s,strlen(s),0);}else{printf(r);if(m_socket)closesocket(m_socket);m_socket=NULL;returnFALSE;}}else{if(m_socket)closesocket(m_socket);m_socket=NULL;?BSlVdUjnie」【linN二妙pos—iu:ft9>|DOS_lU)19>|DOS9SOpfte>|DOS_iu)4!^(J)puud}9S|9{:(0,(S)U9|JlS,S,19>|DOS_lU)pU9S=U9|器參纜修S尊◎膽胡到層豆坯〃?(..u\J\NID01HinV..,sGjeqD))puuds=u9|}(0二二uoq!sod)j!丄沓罰回聊竺峯'者剖輕0立空者瞬&三W&0WW回蟲(chóng)期條〃【(“os乙)aediuo丁(£'o)Hsqns~suodsa二uo^sodiu!:j=9suodse」}(U引)j!WW&0回蟲(chóng)器參纜勒尋//l(03ZIS\Lm>DVcrxVIAr」(¥」eLp)M>pos—w)2a=u引?BSlVdUjniejelse{if(m_socket)closesocket(m_socket);m_socket=NULL;returnFALSE;}//等待登錄回應(yīng)len=recv(m_socket,(char*)r,MAX_PACKET_SIZE,0);//接收服務(wù)器返回的信息if(len){response=r;intposition=response.substr(0,3).compare("334");//判斷返回信息的前三個(gè)字符是否為334,如果是,表示此時(shí)可以輸入64位編碼過(guò)的用戶(hù)名了if(position==0){unsignedchar*dst=(unsignedchar*)smtpUser;stringstrTmp=Base64::base64_encode(dst,len);//進(jìn)行64位編碼len=sprintf((char*)s,"%s\r\n",(constchar*)strTmp.c_str());len=send(m_socket,s,strlen(s),0);//發(fā)送編碼過(guò)的用戶(hù)名}else{if(m_socket)closesocket(m_socket);m_socket=NULL;printf(r);returnFALSE;}}else{if(m_socket)closesocket(m_socket);m_socket=NULL;returnFALSE;}//發(fā)送完用戶(hù)名后等待回應(yīng)len=recv(m_socket,(char*)r,MAX_PACKET_SIZE,0);//發(fā)送編碼過(guò)的密碼,代碼和發(fā)送用戶(hù)名時(shí)的方式類(lèi)似if(len){response=r;intposition=response.substr(0,3).compare("334");if(position==0){unsignedchar*dst=(unsignedchar*)smtpPass;len=strlen((char*)dst);stringstrTmp=Base64::base64_encode(dst,len);len=sprintf((char*)s,"%s\r\n",(constchar*)strTmp.c_str());len=send(m_socket,s,strlen(s),0);}else{if(m_socket)closesocket(m_socket);m_socket=NULL;printf(r);returnFALSE;else{if(m_socket)closesocket(m_socket);m_socket=NULL;returnFALSE;}//發(fā)送完密碼后等待回應(yīng)看是否登錄成功len=recv(m_socket,(char*)r,MAX_PACKET_SIZE,0);if(len){response=r;intposition=response.substr(0,3).compare("235");if(position==0){len=sprintf((char*)s,"MAILFROM:<%s>\r\n",senderMail);len=send(m_socket,s,strlen(s),0);//發(fā)送本地郵箱的地址}elseclosesocket(m_socket);m_socket=NULL;printf(r);returnFALSE;}}else{if(m_socket)closesocket(m_socket);m_socket=NULL;returnFALSE;}//header部份len=recv(m_socket,(char*)r,MAX_PACKET_SIZE,0);if(len){response=r;intposition=response.substr(0,3).compare("250");if(position==0)len=sprintf((char*)s,"RCPTTO:<%s>\r\n",to.c_str());//發(fā)送要發(fā)送的郵箱的地址len=send(m_socket,s,strlen(s),0);}else{if(m_socket)closesocket(m_socket);m_socket=NULL;printf(r);returnFALSE;}}else{if(m_socket)closesocket(m_socket);m_socket=NULL;returnFALSE;//header部份len=recv(m_socket,(char*)r,MAX_PACKET_SIZE,0);if(len){response=r;intposition=response.substr(0,3).compare("250");if(position==0){len二sprintf((char*)s,"DATA\r\n");〃發(fā)送data向服務(wù)器發(fā)送郵件內(nèi)容的申請(qǐng)len=send(m_socket,s,strlen(s),0);}else{if(m_socket)closesocket(m_socket);m_socket=NULL;printf(r);returnFALSE;}}elseif(m_socket)closesocket(m_socket);m_socket=NULL;returnFALSE;}len=recv(m_socket,(char*)r,MAX_PACKET_SIZE,0);if(len){response=r;intposition=response.substr(0,3).compare("354");if(position==0){chardate_string[MAX_PACKET_SIZE];time_tseconds;//調(diào)用本地時(shí)間time(&seconds);strftime(date_string,MAX_PACKET_SIZE,"%a,%d%b%y%H:%M:%S+0800",localtime(&seconds));sprintf((char*)s,"From:%s\r\nTo:%s\r\nDate:%s\r\nSubject:%s\r\n\r\nX-Mailer:%s\r\nX-Priority:%s\r\nMIME-Version:1.0\r\nContent-type:multipart/mixed;boundary=\"%s\"\r\n\r\n",senderMail,to.c_str(),date_string,title.c_str(),"SMailer","3","#BOUNDARY#");len=send(m_socket,s,strlen(s),0);}else{if(m_socket)closesocket(m_socket);m_socket=NULL;printf(r);returnFALSE;}}else{if(m_socket)closesocket(m_socket);m_socket=NULL;returnFALSE;}//郵件正文sprintf((char*)s,"--%s\r\nContent-Type:%s\r\nContent-Disposition:%s\r\nContent-Transfer-Encoding:%s\r\n\r\n%s\r\n\r\n","#BOUNDARY#","text/plain;charset=gb2312","","8bit",body.c_str());len=send(m_socket,s,strlen(s),0);//郵件結(jié)束sprintf((char*)s,"\r\n--%s--\r\n.\r\n","#BOUNDARY#");len=send(m_socket,s,strlen(s),0);len=recv(m_socket,(char*)r,MAX_PACKET_SIZE,0);if(len){response=r;intposition=response.substr(0,3).compare("250");if(position==0){//退出連接sprintf((char*)s,"QUIT\r\n");len=send(m_socket,s,strlen(s),0);}elseif(m_socket)closesocket(m_socket);m_socket=NULL;printf(r);returnFALSE;}}else{if(m_socket)closesocket(m_socket);m_socket=NULL;returnFALSE;}//斷開(kāi)連接len=recv(m_socket,(char*)r,MAX_PACKET_SIZE,0);if(len){response=r;intposition=response.substr(0,3).compare("221");if(position==0){if(m_socket)closesocket(m_socket);m_socket=NULL;}else{if(m_socket)closesocket(m_socket);m_socket=NULL;printf(r);returnFALSE;}}else{if(m_socket)closesocket(m_socket);m_socket=NULL;returnFALSE;returnTRUE;}Base64.cpp:#include"StdAfx.h"#include"Base64.h"staticconststd::stringbase64_chars="ABCDEFGHIJKLMNOPQRSTUVWXYZ""abcdefghijklmnopqrstuvwxyz""0123456789+/";std::stringBase64::base64_encode(unsignedcharconst*bytes_to_encode,unsignedintin_len){std::stringret;inti=0;intj=0;unsignedcharchar_array_3[3];while(in_len--){char_array_3[i++]=*(bytes_to_encode++);if(i==3){char_array_4[0]=(char_array_3[0]&0xfc)>>2;char_array_4[1]=((char_array_3[0]&0x03)<<4)+((char_array_3[1]&0xf0)>>4);char_array_4[2]=((char_array_3[1]&0x0f)<<2)+((char_array_3[2]&0xc0)>>6);char_array_4[3]=char_array_3[2]&0x3f;for(i=0;(i<4);i++)ret+=base64_chars[char_array_4[i]];i=0;}}if(i){for(j=i;j<3;j++)char_array_4[0]=(char_array_3[0]&0xfc)>>2;char_array_4[1]=((char_array_3[0]&0x03)<<4)+((char_array_3[1]&0xf0)>>4);char_array_4[2]=((char_array_3[1]&0x0f)<<2)+((char_array_3[2]&0xc0)>>6);char_array_4[3]=char_array_3[2]&0x3f;for(j=0;(j<i+1);j++)ret+=base64_chars[char_array_4[j]];while((i++<3))ret+='=';}returnret;}std::stringBase64::base64_decode(std::stringconst&encoded_string){intin_len=encoded_string.size();inti=0;intj=0;intin_=0;unsignedcharchar_array_4[4],char_array_3[3];std::stringret;while (in_len-- &&(encoded_string[in_]!='=')&&is_base64(encoded_string[in_])){char_array_4[i++]=encoded_string[in_];in_++;if(i==4){for(i=0;i<4;i++)char_array_4[i]=base64_chars.find(char_array_4[i]);char_array_3[0]=(char_array_4[0]<<2)+((char_array_4[1]&0x30)>>4)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2030年中國(guó)琉璃底瓦數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 12 雪地里的小畫(huà)家 (教學(xué)設(shè)計(jì))-2024-2025學(xué)年統(tǒng)編版語(yǔ)文一年級(jí)上冊(cè)
- 正規(guī)財(cái)務(wù)合同范本
- 承包稻田合同范本
- 2025至2030年中國(guó)鍛鋼型彈簧片數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2025年預(yù)付費(fèi)水表外殼項(xiàng)目可行性研究報(bào)告
- 2024年互聯(lián)網(wǎng)廣告行業(yè)市場(chǎng)深度調(diào)查及發(fā)展前景研究預(yù)測(cè)報(bào)告
- 2025至2030年8U大功率節(jié)能燈項(xiàng)目投資價(jià)值分析報(bào)告
- 2025年鞋帽用布項(xiàng)目可行性研究報(bào)告
- 2025年迷你電烤箱項(xiàng)目可行性研究報(bào)告
- 酒店服務(wù)禮儀(中職酒店服務(wù)與管理專(zhuān)業(yè))PPT完整全套教學(xué)課件
- 燃燒器更換施工方案
- 體育旅游課件第二章體育旅游資源
- 節(jié)能降耗培訓(xùn)
- 質(zhì)量部架構(gòu)圖
- 結(jié)構(gòu)化學(xué)-第1章講義課件
- 粉塵防爆安全管理臺(tái)賬-全套
- 廣州退休申請(qǐng)表范本
- 管道完整性管理方法及應(yīng)用
- 傳媒侵權(quán)法介紹
- 麥茬花生高產(chǎn)栽培技術(shù)
評(píng)論
0/150
提交評(píng)論