【正文】
mail自動(dòng)分組。并且這些功能要能夠有很好的擴(kuò)展性,為了達(dá)到擴(kuò)展性的要求,本文從以下幾個(gè)方面進(jìn)行設(shè)計(jì):惡意郵件的關(guān)鍵字可以手動(dòng)添加,添加完成之后保存于數(shù)據(jù)庫中以便用戶在下次實(shí)用時(shí)不需要重復(fù)輸入關(guān)鍵字進(jìn)行掃描。本系統(tǒng)用VC開發(fā),連接數(shù)據(jù)庫采用ADO方式與Access進(jìn)行連接。本系統(tǒng)建立兩張表:keyword表和book表。表42 用戶信息表(通信錄表)book字段含義字段名數(shù)據(jù)類型說明姓名name文本Email地址文本 MFC連接數(shù)據(jù)庫本系統(tǒng)在進(jìn)行數(shù)據(jù)庫連接時(shí)采用的是ADO方式進(jìn)行連接。接下來詳細(xì)介紹連接過程:COM庫的初始化我們可以使用AfxOleInit()來初始化COM庫,這項(xiàng)工作通常在CWinApp::InitInstance()的重載函數(shù)中完成,代碼:BOOL CADOTest1App::InitInstance(){ AfxOleInit()?!RESULT hr。///連接數(shù)據(jù)庫 //上面一句中連接字串中的Provider是針對(duì)ACCESS2000環(huán)境的,對(duì)于ACCESS97, //需要改為:Provider=。///顯示錯(cuò)誤信息 }在這段代碼中我們是通過Connection對(duì)象的Open方法來進(jìn)行連接數(shù)據(jù)庫的。插入操作采用的是Connection對(duì)象的Execute方法執(zhí)行SQL命令。(5) 關(guān)閉記錄集與連接 記錄集或連接都可以用Close()方法來關(guān)閉:m_pRecordsetClose()。該動(dòng)態(tài)鏈接庫封裝了對(duì)郵件相關(guān)的操作。 ErrorMessage : String :,包含的是錯(cuò)誤信息 ??梢灾付ǘ鄠€(gè)服務(wù)器,用分號(hào)點(diǎn)開。 :2500在連接服務(wù)器并收取Email時(shí),用戶在輸入有關(guān)信息時(shí)有可能會(huì)在前面或后面帶上空格,我們必須過濾這些空格,否則的話會(huì)出現(xiàn)服務(wù)器地址輸入錯(cuò)誤或者用戶名或密碼輸入錯(cuò)誤。同樣的道理用戶很有可能會(huì)忘記輸入服務(wù)器地址,沒有輸入該信息系統(tǒng)根本不知道從哪個(gè)郵件服務(wù)器中接收郵件,這時(shí)我們也必須加一個(gè)判斷條件,以減少系統(tǒng)出錯(cuò)的概率,讓我們的系統(tǒng)更加健壯。在接收郵件時(shí)的連接在其他的類中要用到,此時(shí)必須定義一個(gè)類的共有成員來指向該指針,只有這樣在刪除時(shí)才能夠用該連接指針。在收取了所有的Email的時(shí)候,同時(shí)在集合類當(dāng)中存儲(chǔ)了所有的郵件信息。 ()。 ()。 return。 try { jmail::IPOP3Ptr pPOP3()。 // 連接郵件服務(wù)器 pPOP3Connect((LPCTSTR)m_strUserid, (LPCTSTR)m_strPassword, (LPCTSTR)m_strMailServer, 110)。 CMessages * EMail_Messages。 i = lCount。 _bstr_t bstrBody = pMessageBody。//將郵件信息添加到列表框控件中 int nListItem = (i, (const char * )bstrFrom)。 ()。 }接收部分流程圖如圖42所示:圖42 接收部分流程圖在接收了所有的郵件之后,用戶在郵件列表當(dāng)中點(diǎn)擊某個(gè)Email的時(shí)候,必須要顯示出郵件的正文供用戶閱讀。 if(pos) { int nItem = (pos)。} 惡意Email處理惡意郵件已經(jīng)成為威脅用戶安全的主要形式之一,如何能夠做到及時(shí)發(fā)現(xiàn)惡意郵件并由用戶進(jìn)行相應(yīng)的操作已經(jīng)成為Email使用者廣泛關(guān)注的問題,同樣也是一個(gè)亟待解決的問題之一。為了增強(qiáng)系統(tǒng)在此方面的可擴(kuò)展性,本文提出了一種將關(guān)鍵字存儲(chǔ)與數(shù)據(jù)庫的方法,用戶可以隨時(shí)增加關(guān)鍵字,當(dāng)然這些關(guān)鍵字不是絕對(duì)的,只是用戶認(rèn)為的含有這些關(guān)鍵字的Email為惡意Email。惡意郵件分析(掃描)過程如下:當(dāng)點(diǎn)擊“分析”按鈕時(shí),系統(tǒng)從存儲(chǔ)的所有郵件信息的集合類當(dāng)中逐條取出每個(gè)成員,即每封Email,再對(duì)每封Email進(jìn)行分析。在進(jìn)行分析時(shí),為了讓用戶明確知道現(xiàn)在分析的是哪一封Email,在對(duì)話框的最下面會(huì)顯示進(jìn)度,效果如圖43所示:圖43 分析惡意Email效果圖分析部分的代碼實(shí)現(xiàn)如下://分析郵件是否為垃圾郵件void CTRASHMAILPROCESS::OnAnysis() { // TODO: Add your control notification handler code here //初始化相關(guān)變量及控件 int trashnum=0。 //信箱中沒有郵件 if(()==0) { AfxMessageBox(信箱為空)。 //顯示正在掃描 for(int i=0。 //顯示正在掃描的郵件的主題 //從數(shù)據(jù)庫中選出所有的關(guān)鍵字 _RecordsetPtr m_pRecordset。 //依次檢查郵件的主題和正文中是否含有關(guān)鍵字,若有則為垃圾郵件 while(!m_pRecordsetadoEOF) { strKeywords=(LPCTSTR)((_bstr_t)m_pRecordsetGetCollect(keyword))。 trashnum=trashnum+1。 //找到第一個(gè)關(guān)鍵字就退出該Email的查找,直接進(jìn)入下一個(gè)Email的查找 } m_pRecordsetMoveNext()。 //掃描信息 (共檢測(cè)到%d封惡意郵件,trashnum)。分析惡意Email的流程如圖44所示:圖44 分析惡意Email流程圖 惡意Email的刪除在經(jīng)過系統(tǒng)分析初步認(rèn)定為惡意Email后,將準(zhǔn)惡意Email列在了惡意Email列表中,此時(shí)用戶可以進(jìn)行刪除或則忽略操作。這就要用到j(luò)mail動(dòng)態(tài)鏈接庫中的一個(gè)方法:DeleteSingleMessage(ID),ID是該郵件在郵件信息指針中的序號(hào),該序號(hào)是從1開始的,與我們習(xí)慣的數(shù)組從0開始所不同。因?yàn)樵谶M(jìn)行刪除操作時(shí)根本找不到該Email。以下是刪除某封惡意Email的代碼://刪除選中的垃圾郵件void CTRASHMAILPROCESS::OnDelete() { // TODO: Add your control notification handler code here //獲得點(diǎn)擊郵件的索引號(hào) int nItem。 //獲得郵件的index并刪除該郵件 int messagenum=atoi((nItem))。i++) { if(((CMessages *)(i))index==messagenum) { (i)。 (nItem)。所以在設(shè)計(jì)系統(tǒng)時(shí)必須要考慮這種情況,決不能讓這樣的事件發(fā)生在Email分析系統(tǒng)上。在進(jìn)行忽略操作時(shí)只需要簡(jiǎn)單得將惡意Email列表框控件中對(duì)應(yīng)的項(xiàng)刪除并將惡意郵件集合類中相關(guān)項(xiàng)的信息刪除就可以了。 }// long index=(int)pos。 (nItem)。在用戶發(fā)現(xiàn)這種情況之后,用戶可以添加相關(guān)關(guān)鍵字來避免同種郵件不會(huì)被系統(tǒng)漏檢的情況。該部分程序?qū)崿F(xiàn)代碼如下:void CAddKeyWordsDlg::OnOK() { // TODO: Add extra validation here //添加關(guān)鍵字 CString str,SQL。),str)。 }}至此,系統(tǒng)已經(jīng)實(shí)現(xiàn)了惡意郵件的處理中的所有功能,這對(duì)于一個(gè)Email分析系統(tǒng)來說是一個(gè)非常重要的功能。本文將簡(jiǎn)要分析一下這兩種分組的利與弊。雖然這種分類不一定準(zhǔn)確,但也給用戶的判斷帶來了一定的依據(jù)。 按時(shí)間進(jìn)行分組按時(shí)間進(jìn)行分組是目前用得比較多的分組方式,比如在163的Email服務(wù)器上就有一個(gè)簡(jiǎn)單的按時(shí)間進(jìn)行分組的功能。該時(shí)間與運(yùn)行該Email分析系統(tǒng)的客戶端的系統(tǒng)時(shí)間相比較,若和系統(tǒng)時(shí)間的日期相等則將該Email放到今天收到的Email分組中。如果再次點(diǎn)擊該郵件列表中相應(yīng)的Email的話就會(huì)在下方的顯示Email正文的控件中顯示該Email的正文,以便用戶閱讀。 HTREEITEM hItem_today = (_T(今天),0,1,hItem1B,TVI_LAST)。 //獲取當(dāng)前系統(tǒng)時(shí)間進(jìn)行初始化樹形控件// CString today。 int month = ()。 CString subject = 。 (subject,0,1,hItem_today,TVI_LAST)。 (subject,0,1,hItem_twodaysago,TVI_LAST)。 long leng = ()。i++) {//檢索所有今天收到的郵件 if (((CMessages *)[i])strTime==today) { subject = ((CMessages *)[i])strSubject。 (nListItem, 2, LVIF_TEXT, today, 0, 0, 0, NULL)。i++) {//檢索所有今天收到的郵件 if (((CMessages *)[i])strTime==yestoday) { subject = ((CMessages *)[i])strSubject。 (nListItem, 2, LVIF_TEXT, yestoday, 0, 0, 0, NULL)。i++) {//檢索所有今天收到的郵件 if (((CMessages *)[i])strTime!=yestoday amp。 from = ((CMessages *)[i])strFrom。 } } }在點(diǎn)擊郵件列表中相關(guān)信息時(shí)在相應(yīng)控件中顯示該Email正文的主要實(shí)現(xiàn)是要通過一個(gè)消息處理來實(shí)現(xiàn)的。 if(pos) { int nFirstSelItem = (pos)。 //AfxMessageBox(strid+strjiaose+strpsd)。i++) {//檢索所有今天收到的郵件 if (((CMessages *)[i])strTime==strDate amp。 ((CMessages *)[i])strSubject==strSubject) { content = ((CMessages *)[i])strMessageBody。要高效查找并閱讀Email的話,實(shí)現(xiàn)按好友分組的功能是一個(gè)很好的選擇。經(jīng)過簡(jiǎn)單測(cè)試得到好友樹狀結(jié)構(gòu)產(chǎn)生效果如圖49所示。 HTREEITEM hItem2_f1。 hItem2_f1= (name,0,1,hItem2_f,TVI_LAST)。 (subject,0,1,hItem2_f1,TVI_LAST)。 }BOOL falg。 m_RecordsetPtrMoveFirst()。 break。 (subject,0,1,hItem2_m,TVI_LAST)。i++) { if (((CMessages *)[i])strSubject==S1) { date = ((CMessages *)[i])strTime。 (nListItem, 1, LVIF_TEXT, subject, 0, 0, 0, NULL)。按好友分組處理過程的流程圖如圖410所示:圖410 按好友分組處理流程圖在進(jìn)行好友分組之后,對(duì)Email的操作過程類似與按時(shí)間分組,雙擊某個(gè)Email時(shí)就會(huì)在Email列表框控件中顯示該Email的相關(guān)信息,當(dāng)點(diǎn)擊該Email時(shí)就可以在相應(yīng)的文本框中顯示出該Email的正文。 添加好友信息該系統(tǒng)在給每個(gè)用戶使用時(shí),好友列表是空的,這就以為這在添加好友信息之前,實(shí)現(xiàn)Email的按好友分組功能是沒有任何意義的。在添加好友信息時(shí),本文的做法是在填寫完相關(guān)的好友信息之后將輸入的相關(guān)字符串存入Access數(shù)據(jù)庫的相應(yīng)表格中。 CString strSQL。%s39。 (select * from book )。 5 程序調(diào)試本文所設(shè)計(jì)的程序開始在調(diào)試時(shí)出現(xiàn)了很多問題,比如Email刪除不正確,分析其主要原因如下:(1) 在進(jìn)行刪除時(shí)連接已經(jīng)關(guān)閉了,在進(jìn)行刪除時(shí)出現(xiàn)了非法操作。通過這些錯(cuò)誤的調(diào)試,我學(xué)到了如何高效快速得調(diào)試程序并及時(shí)發(fā)現(xiàn)錯(cuò)誤所在。如何正確高效地實(shí)用調(diào)試工具還將在以后的工作學(xué)習(xí)中繼續(xù)學(xué)習(xí)。這兩種方法在優(yōu)缺點(diǎn)上進(jìn)行了互補(bǔ),給用戶對(duì)Email的管理帶來了極大的便利性。Email分析系統(tǒng)的發(fā)展任重而道遠(yuǎn)。t wait. And the air currents were fabulous. I had a little red sail plane I used to go sky surfing in, every couple of days. It was the good life. I played drums till all hours in a basement spot up the river where the walls sweated almost as much as the customers and the smoke used to wash around the lights like streams of milk. When I was done playing I