下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
AsiaInfo項(xiàng)目管理文AIMCPro1.5-EM詳細(xì)設(shè)者(及其職務(wù)亞信科技(中國,不可全部或部分、、使用于任何目的。者目 圖 第一章引 文檔用 閱讀對 參考資 第2章概 概 功能定 設(shè)計(jì)約 第3章總體結(jié)構(gòu)說 總體結(jié) 3.2.1模塊功 命令解析模塊功 郵件代收模塊功 POP代 避免循環(huán)收 避免重復(fù)收 UIDL更新策 依賴的外部接 POP3協(xié)議指 對外提供的接 CEMApi接口定 代收郵 檢測POP帳 關(guān)閉連 CEMApi實(shí) 郵件代收流 第4章功能實(shí)現(xiàn)說 主流 數(shù)據(jù)流程 實(shí)現(xiàn)說 配置文件說 模塊功能實(shí) 數(shù)據(jù)流程 實(shí)現(xiàn)說 關(guān)鍵代碼說 數(shù)據(jù)流程 實(shí)現(xiàn)說 數(shù)據(jù)流程 實(shí)現(xiàn)說 圖圖3.1系統(tǒng)結(jié)構(gòu) 圖3.2UIDL更新策略 圖3.3郵件代收流程 圖4.1主流程 圖4.2模塊流程 圖4.3命令解析流程 圖4.4郵件代收模塊流程 圖4.5初始化StartPopHander流程 圖4.6代收一封郵件流程 第一章文檔用閱讀對AsiaiInfoMailCenterProfessionalForPostOfficePOPIMAPMCMailCommandMailStoreEM參考資123《RFC19394第2概概EM是AIMCPro1.5大容量郵件系統(tǒng)的一個(gè)增值服務(wù)子系統(tǒng)。目前,它主要是為AIWMCU/PMail/IMail提供POP3的增值服務(wù)。EM接收POP代收請求,然后連接到用戶給出的POP3服務(wù)器,將用戶的郵件取回并放入MSS服務(wù)器中的用戶郵箱內(nèi)。功能定EM實(shí)現(xiàn)的功能POPUIDLUIDL的設(shè)計(jì)約第3章總體結(jié)構(gòu)說總體結(jié)EM系統(tǒng)結(jié)構(gòu)圖如下3.1郵件代收模命令解析模模EM GETMAILTESTPOP3Server更新策略、UIDL的等。POP對于POP代收郵箱的服務(wù)器來說,EM作為POP客戶端,將POP代收郵箱的信收取到代收郵件時(shí),首先檢查郵件頭部是否含有X-AIMC-EM。如果不含有X-AIMC-EM,便 Name,( 地址,Name為代收郵箱地址)并繼續(xù)代收流程;否則,檢查郵件頭X-AIMC-EM列表是否Name,POP賬號進(jìn)行取信操作。這一點(diǎn)可以通過unlockpopaccount時(shí)間與當(dāng)前時(shí)間是否小于超時(shí)時(shí)間,是的話報(bào)“l(fā)ockpopaccountUIDLCToDO的集合是NEWCN封郵件后(N可配置,配置項(xiàng):uidl_list_flush_frequency,則往集合OLD中增加這些郵件的UIDL(以“\n”分隔每個(gè)UIDL)。收取郵件失敗時(shí),跳過代收流程,不插入OLDC圖圖3.2UIDLUIDLUIDL在MB中的POP_UIDL_LIST表中,該表的數(shù)據(jù)字典如下create_time依賴的外部接POP3POP3無郵箱無無-POP結(jié)束指令。接收方必須OK無無-獲取最近得郵件無-unique-id無-對外提供的接CEMApi接口定C:C:GETMAIL<uid><index>\r\nS:+OKCommandAccepted\r\nS:-ERR<errormessage>\r\nS:-BUSY...\r\n服務(wù)器端操作成功返回服務(wù)器端操作成功返回+OKCommand語法錯(cuò)誤返回-ERRSyntex服務(wù)器忙返回-BUSYPOPC:TESTuserPOP3ServerPOP3C:TESTuserPOP3ServerPOP3portPOP3userPOP3password><式S:+OKTestS:-ERR<error服務(wù)器端操作成功返回+OKTest語法錯(cuò)誤返回-ERRSyntex超時(shí)返回-ERR參數(shù)說明POP3Server:POP3port:POP3user:POP3password:POPPOP3服務(wù)器地址IP)POP3POP3。通常為110POP3POP3。(Reserve)0超時(shí)值(秒),若Server在TimeOutS:+OKConnectionisclosingnow\r\nS:-ERR<errormessage>\r\n服務(wù)器端操作成功返回+OKConnectionisclosing語法錯(cuò)誤返回語法錯(cuò)誤返回-ERRSyntexERROR命令失敗返回-ERRCommandFailCEMApi實(shí)初始化EMIP地址,端對指定用戶的所有POP帳號進(jìn)行POP代收。本函數(shù)對用戶的每個(gè)POP帳號,調(diào)GETMAILPOPPOP3ServerPOP3Server郵件代收1:1:客戶端調(diào)用4:根據(jù)第3步的結(jié)果,構(gòu)造請求信息并使用GETMAIL命令進(jìn)行發(fā)3:返回結(jié)5:服務(wù)器立即返回+OK6:調(diào)用PopHandler行郵件代收工9:更新郵件、8:返回代收郵圖3.3Api,服務(wù)端正確解析命令后,使用POP3協(xié)議收取郵件,把新郵件寫入MSS用戶相應(yīng)的郵箱中創(chuàng)建多進(jìn)創(chuàng)建多進(jìn)初始化數(shù)結(jié)等待結(jié)第4章功能實(shí)現(xiàn)說主流開讀開讀配置文圖圖4.1建 線module_name=em;;modulenamestation_ID=10;;stationIDinMRAgentlocal_ip_address=10.3.3.100;;serverbindingip;;FORMAT:IPaddress,local_port=;;serverlisten;;FORMAT:>02299read_buffer_size=;;connectionrecvbuffer,maxcmdline;;FORMAT:>0,defaultwrite_buffer_size=;;connectionsendbuffer,maxcmdline;;FORMAT:>0,defaultacceptor_processor_pool_size=;;acceptorprocessorpool;;FORMAT:>0,defaultuidl_list_flush_frequency=;;uidllistflush;;FORMAT:>0,default10default_timedout=;;connectionorrequestdefault;;FORMAT:>0,default60pop_lock_timedout=;;poplock;;FORMAT:>0,default1800status_dump_interval=;; serverstatusdumptime;;FORMAT:>0,default10name=default;;taskprocessor;;FORMAT:queue_size=;;queue;;FORMAT:thread_count=;;thread;;FORMAT:name=test;;taskprocessor;;FORMAT:queue_size=;;queue;;FORMAT:thread_count=;;thread;;FORMAT:name=;;taskprocessor;;FORMAT:queue_size=;;queue;;FORMAT:thread_count=;;thread;;;;FORMAT:模塊的名稱,必須和MRAgent配置的EM的stationid,MRAgent配置MRAgentIPEM提供服務(wù)的端UIDLprocessor0的名字,如果代收郵箱不是processorN中配置的郵箱,則代收郵件processor0處理。4.2模塊功能實(shí)開建建等等待TCP連處理線循解析協(xié)解析協(xié)處理請封裝協(xié)循環(huán)結(jié)發(fā)送響圖 模塊流程模塊創(chuàng)建一個(gè)命令行協(xié)議線程,對每一個(gè)TCP連接創(chuàng)建一個(gè)線程處理數(shù)據(jù)。TCPintintclsDaemon::ciTcpServer(void{intliSocket,option=1,liReOpen,liResult,liRet=0,liLeft;socklen_tltSockLen;structsockaddr_ininServer;structsockaddr_ununServer;unionSockAddrun time_ttEnd;charlsIP[SIZE_16B];BadIP_tltBadIP,*lptBadIP;if(cpTCB==NULL)return-1;tOpenedFiles++;doliReOpen=0gvLog(LOG_DBG_MDBG,"STAT:Tryingtoopenadaemonsocketonport[%s]...",csID);/*Createasocket.ciDaemonSocket=socket(ciFamily,SOCK_STREAM,0);if(ciDaemonSocket<0){gvLog( errno,strerror(errno));liRet=-1;break;}/*SetthesocketoptionsothattheTCPportcanbere-usedwhenthedaemonisdownandupagain*/if(setsockopt(ciDaemonSocket,SOL_SOCKET,SO_REUSEADDR,(char*)&option,sizeof(option))<0){gvLog(LOG_ERR_SYS,"ERROR%i:Cannotsetsocketoptionforthedaemonsocket,%s.",errno,strerror(errno))assert(close(ciDaemonSocket)==0);liRet=-2;break}//giSetHandlerOption(ciDaemonSocket,FD_CLOEXEC,O_NDELAY);if(ciFamily==AF_INET){memset(&inServer,0,sizeof(inServer))/*BindsocketusingwildcardsandspecifiedTCPport*/inServer.sin_family=ciFamily;if(csBindIP!=NULL&&*csBindIP!='\0')inServer.sin_addr.s_addr=inet_addr(csBindIP);inServer.sin_addr.s_addr=INADDR_ANY;inServer.sin_port=htons(ciPort);/*seteffectiveuidtorootiftheportnumberissmallerthan1024*/if(ciPort<ROOT_PORTS)setreuid((uid_t)-1/*-1*/,liResult=bind(ciDaemonSocket,reinterpret_cast<structsockaddr*>(&inServer),sizeof(inServer));/*restoretheuidforsecurity*/if(ciPort<ROOT_PORTS)assert(setreuid((uid_t)-1/*-1*/,ctUid)==0)}elseunlink(csID);unServer.sun_family=ciFamily;Strncpy(unServer.sun_path,csID,sizeof(unServer.sun_path));liResult=bind(ciDaemonSocket,reinterpret_cast<structsockaddr*>(&unServer),sizeof(unServer))}if(liResult==-1)gvLog(LOG_ERR_SYS,"ERROR%i:Cannotbindadaemonsocketonport[%s],%s.",errno,csID,strerror(errno));assert(close(ciDaemonSocket)==0);ciDaemonSocket=0;liRet=-3;break;}/*Startacceptingconnections.ciRunning=1;/*Flagtoindicatetheserverisruning*/ciShutDown=0;/*Signaltogoshutdown*/assert(listen(ciDaemonSocket,ciListenQueueLen)==0)gvLog(LOG_DBG_MSG,"MESG:Thisserverislisteningonport[%s],bindingon%s.",csID,csBindIP!=NULL&&*csBindIP!='\0'?csBindIP:"allIPs");for(tEnd=time(NULL)+ciTime;(ciTime<=1||time(NULL)<tEnd)&&ciShutDown==0;){ defineuse_select ifdef/*preparetoselectfromtheTCPport*/fd_setready;structtimevalto;FD_ZERO(&ready);FD_SET(ciDaemonSocket,&ready);to.tv_sec=miSelectTimeout;to.tv_usec=0;liResult=select(ciDaemonSocket+1,&ready,NULL,NULL,&to); intliReadyliResult=giPoll(ciDaemonSocket,POLLIN,&liReady,miSelectTimeout); if(liResult<0&&errno!=EINTR&&ciShutDown==0)gvLog(LOG_ERR_SYS,"ERROR%i:Selectdaemonsocket(port:%s)=%i,%s.",errno,csID,liResult,strerror(errno));liReOpen=1;break;}elseif(liResult<=0)continue; ifdefintliThreadAvailable=cpTCB->ciGetCount()>0; intliThreadAvailable=ciCountActive()<ciRealThreads; ifdefif(FD_ISSET(ciDaemonSocket,&ready)&&liThreadAvailable) if((liReady&POLLIN)!=0&&liThreadAvailable) {/*Herecomestheconnectionsmemset( ,0,sizeof( ))/*establishedconnectiongvLog(LOG_DBG_STAT,"STAT:Readytoacceptonsocket%i...",ciDaemonSocket);ltSockLen=sizeof( .sa)liSocket=accept(ciDaemonSocket,&un .sa,<SockLen);if(liSocket==-1){tAcceptFail++gvLog(LOG_ERR_SYS,"ERROR%i:%iconnectionsacceptfailedonport tAcceptFail,csID,strerror(errno))if(errno!=EMFILE&&errno!=ENFILE&&errno!=EAGAIN&&ciShutDown==0){if(ciPort<ROOT_PORTS)liReOpen=//liReOpen=1//<liReOpen=1;break;>meansthelisteningportwillbeclosedfor2seconds,//thenbe//Butwefoundiftheprogramisnotinvokedbytheportunder//cannotbereopenedduetopermissionevenifitsuid/euidissetto//Sowehavetokeepthelistening//continue}elseif(ciTime<=1){sleep(EMFILE_DELAY);continue;/*Nomoreprocessallowed,handlebyitself}break}gsGetIPbyNumber( .in.sin_addr,lsIP,sizeof(lsIP))
//<AppendedbyFSPC,2002-2-26,toinvokecall-backipcharlsBuf[256];lsBuf[0]=if(cfIPCheck!=NULL&&cfIPCheck(lsIP,sizeof(lsBuf))!=0)if(lsBuf[0])iSockPuts(liSocket,"%s\r\n",lsBuf);close(liSocket);gvLog(LOG_DBG_DONE,"DONE:Socket%ifrom%srejectedbycallbackfunction.",liSocket,lsIP);}Strncpy(ltBadIP.sIP,lsIP,sizeof(ltBadIP.sIP))if(cpBadIPs->ciSearch(<BadIP,(int(*)(constvoid*,const 0,0,(void**)&lptBadIP)>=0if((liLeft=time(NULL)-lptBadIP->tLast)<ciBadIpTimeout){close(liSocket);gvLog(LOG_DBG_DONE,"DONE:Socket%ifrom%srejected,%isecondstoretry.",liSocket,lsIP,ciBadIpTimeout-liLeft);continue;}elsecpBadIPs->ciDelete(lptBadIP)gvLog(LOG_DBG_STAT,"STAT:Socket%ifrom%sremovedfromtheip}
liSocket,lsIP)tOpenedFiles++;tAcceptSuccess++;giSetHandlerOption(liSocket,FD_CLOEXEC,O_NDELAY| ifdeflinux elifdefined( O_DSYNC|
BSD )gvLog(LOG_DBG_MDBG,"MDBG:Socket%isuccessfullyaccepted,%i
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 城市綠化帶與人行道接茬方案
- 商業(yè)綜合體消防工程驗(yàn)收合同
- 物流行業(yè)電子設(shè)備回收方案
- 海上運(yùn)輸安全管理方案
- 環(huán)境友好型內(nèi)外墻抹灰施工方案
- 職業(yè)教育教材建設(shè)實(shí)施方案
- 國際學(xué)校軍訓(xùn)安排合同
- 學(xué)前教育教師能力提升制度
- 企業(yè)并購中的資產(chǎn)評估制度探討
- 家庭教育指導(dǎo)服務(wù)項(xiàng)目合作協(xié)議書(2篇)
- 上海市普陀區(qū)2024-2025學(xué)年六年級(五四學(xué)制)上學(xué)期期中語文試題
- 2024黔東南州事業(yè)單位第二批遴選人員調(diào)減遴選歷年高頻難、易錯(cuò)點(diǎn)500題模擬試題附帶答案詳解
- 采伐樹木合同模板
- 培訓(xùn)師破冰游戲大全課件
- 期中測試卷-2024-2025學(xué)年統(tǒng)編版語文三年級上冊
- 綜合素質(zhì)評價(jià)平臺建設(shè)方案-2024
- 小學(xué)學(xué)校信息化管理章程
- 封條模板A4直接打印版
- 《海報(bào)設(shè)計(jì)》PPT課件(完整版)
- 吉林省義務(wù)教育階段新課程計(jì)劃表(新)
- 大學(xué)的學(xué)習(xí)方法PowerPoint 演示文稿
評論
0/150
提交評論