![計(jì)算機(jī)網(wǎng)絡(luò)實(shí)驗(yàn)SMTP郵件發(fā)送系統(tǒng)socket編程_第1頁](http://file4.renrendoc.com/view/e9d5aa31352ddd203fcf6c8f3e64a8f2/e9d5aa31352ddd203fcf6c8f3e64a8f21.gif)
![計(jì)算機(jī)網(wǎng)絡(luò)實(shí)驗(yàn)SMTP郵件發(fā)送系統(tǒng)socket編程_第2頁](http://file4.renrendoc.com/view/e9d5aa31352ddd203fcf6c8f3e64a8f2/e9d5aa31352ddd203fcf6c8f3e64a8f22.gif)
![計(jì)算機(jī)網(wǎng)絡(luò)實(shí)驗(yàn)SMTP郵件發(fā)送系統(tǒng)socket編程_第3頁](http://file4.renrendoc.com/view/e9d5aa31352ddd203fcf6c8f3e64a8f2/e9d5aa31352ddd203fcf6c8f3e64a8f23.gif)
![計(jì)算機(jī)網(wǎng)絡(luò)實(shí)驗(yàn)SMTP郵件發(fā)送系統(tǒng)socket編程_第4頁](http://file4.renrendoc.com/view/e9d5aa31352ddd203fcf6c8f3e64a8f2/e9d5aa31352ddd203fcf6c8f3e64a8f24.gif)
![計(jì)算機(jī)網(wǎng)絡(luò)實(shí)驗(yàn)SMTP郵件發(fā)送系統(tǒng)socket編程_第5頁](http://file4.renrendoc.com/view/e9d5aa31352ddd203fcf6c8f3e64a8f2/e9d5aa31352ddd203fcf6c8f3e64a8f25.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
實(shí)驗(yàn)郵件客戶端實(shí)現(xiàn)1316-30-何珊珊[實(shí)驗(yàn)名稱]:郵件客戶端實(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é)生利用已有的套接字常識使用SMTP和POP3的任一種協(xié)議,實(shí)現(xiàn)對于特定郵件服務(wù)器(mail.163)的發(fā)送郵件功能。[實(shí)驗(yàn)步驟]:在VC6中搭建工程,因?yàn)镾MTP中用戶名和密碼都要經(jīng)過64位編碼的處理,所以工程中除了對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ù)加載套接字庫,并進(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è)客戶端的套接字}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的端口號為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());//將用戶名賦給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回蟲期條〃【(“os乙)aediuo?。ā?o)Hsqns~suodsa二uo^sodiu!:j=9suodse」}(U引)j!WW&0回蟲器參纜勒尋//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位編碼過的用戶名了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ā)送編碼過的用戶名}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);//發(fā)送編碼過的密碼,代碼和發(fā)送用戶名時(shí)的方式類似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)容的申請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;}//斷開連接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. 本站所有資源如無特殊說明,都需要本地電腦安裝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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度硅酮密封膠產(chǎn)品安全認(rèn)證服務(wù)合同
- 2025年個(gè)人租車給公司合同協(xié)議(三篇)
- 2025年度家庭住宅室內(nèi)裝修材料供應(yīng)與施工合同
- 2025年度電力施工臨時(shí)用電勞務(wù)分包合同
- 2025年度國際貨運(yùn)代理服務(wù)合同(2025年度)
- 2025年度房地產(chǎn)開發(fā)項(xiàng)目建筑工程合同模板
- 2025年度專業(yè)化妝學(xué)校教學(xué)用品采購合同
- 2025年度大型企業(yè)集團(tuán)員工健康保險(xiǎn)服務(wù)合同
- 2025年度家用中央空調(diào)清洗保養(yǎng)與客戶滿意度合同
- 2025年度體育賽事贊助及廣告植入合同
- 交叉口同向可變車道動態(tài)控制與信號配時(shí)優(yōu)化研究
- 護(hù)理專業(yè)應(yīng)聘個(gè)人簡歷
- 北師大版二年級上冊100以內(nèi)加減法豎式計(jì)算題300道及答案
- 安華農(nóng)業(yè)保險(xiǎn)股份有限公司北京市地方財(cái)政生豬價(jià)格指數(shù)保險(xiǎn)條款(風(fēng)險(xiǎn)敏感型)
- 事業(yè)單位考試題庫:公文寫作能力測試試題及答案
- 2024-2025學(xué)年北師大版初一物理上冊期末質(zhì)量檢查卷及答案
- 6.2《青紗帳-甘蔗林》-【中職專用】高一語文課件(高教版2023·基礎(chǔ)模塊下冊)
- 2023年開工第一課及復(fù)工復(fù)產(chǎn)考試試題(含答案)
- 宗教知識的課件
- GB/T 22849-2024針織T恤衫
- 設(shè)備維保的維修流程與服務(wù)流程
評論
0/150
提交評論