本發(fā)明屬于電子郵件通訊領(lǐng)域,尤其是涉及一種基于tilera多核板卡網(wǎng)絡(luò)數(shù)據(jù)包的郵件還原方法。
背景技術(shù):
目前,對網(wǎng)絡(luò)數(shù)據(jù)包進(jìn)行郵件還原的技術(shù)實(shí)現(xiàn)上,有通過pfring或libpcap等開源收包庫進(jìn)行網(wǎng)絡(luò)數(shù)據(jù)包獲取,該兩種方式在獲取包的效率上由于存在數(shù)據(jù)到達(dá)硬件層面后經(jīng)過內(nèi)存多次拷貝造成cpu資源開銷負(fù)擔(dān);也有通過多核處理器來進(jìn)行收包,但多核的核數(shù)較少有達(dá)到tilera產(chǎn)品中100核的指標(biāo),設(shè)備板卡形態(tài)也較少達(dá)到tilera一樣可通過pci-e插槽小巧輕便安裝。而郵件還原算法有借助開源庫libnids接口也有自己設(shè)計(jì)實(shí)現(xiàn)的。
技術(shù)實(shí)現(xiàn)要素:
有鑒于此,本發(fā)明旨在提出一種基于tilera多核板卡網(wǎng)絡(luò)數(shù)據(jù)包的郵件還原方法,以解決現(xiàn)有的網(wǎng)絡(luò)數(shù)據(jù)包郵件還原技術(shù)中網(wǎng)絡(luò)數(shù)據(jù)包截獲性能不足,還原算法運(yùn)行平臺較少達(dá)到多核并行的情況。
為達(dá)到上述目的,本發(fā)明的技術(shù)方案是這樣實(shí)現(xiàn)的:
基于tilera多核板卡網(wǎng)絡(luò)數(shù)據(jù)包的郵件還原方法,包括以下步驟:
s1、郵件還原前需要對開發(fā)環(huán)境進(jìn)行部署,包括tilera多核板卡與機(jī)箱硬件的連接,以及軟件系統(tǒng)的安裝;
s2、開發(fā)環(huán)境部署后,進(jìn)行郵件還原,首先基于tilera多核板卡進(jìn)行初始化配置,啟動使用的硬件資源并調(diào)用收包接口進(jìn)行收包;
s3、將收到的數(shù)據(jù)包進(jìn)行tcp流重組模塊;
s4、最后根據(jù)端口分類進(jìn)入到不同的郵件還原模塊進(jìn)行郵件還原操作。
進(jìn)一步的,所述步驟s1中開發(fā)環(huán)境部署,具體方法如下:
s101、將tilera多核板卡插入便攜式一體機(jī)的機(jī)箱pcie插槽上,固定好多核板卡后,將多核板卡的一個(gè)或不多于四個(gè)光口通過光模塊和光纖進(jìn)行連接,網(wǎng)絡(luò)數(shù)據(jù)流通過光纖進(jìn)入多核板卡的光口形成數(shù)據(jù)通路;
s102、在電腦上安裝centos6.5的liunx操作系統(tǒng),并且安裝tilera開發(fā)環(huán)境版本mde4.3.3;
s103、通過tilera的登錄命令tile-monitor來登錄到tilera板卡內(nèi)部的liunx系統(tǒng),在該環(huán)境下開發(fā)部署郵件還原程序代碼。
進(jìn)一步的,所述步驟s1中,所述開發(fā)環(huán)境部署后,對串口進(jìn)行調(diào)試時(shí),將多核板卡的串口調(diào)試口通過調(diào)試線連接到電腦的usb口上,通過tile-console命令登錄到串口調(diào)試輸出端。
進(jìn)一步的,所述步驟s2中,所述tilera多核板卡初始化和收包接口的方法,具體如下:
s201、通過接收用戶設(shè)置參數(shù)進(jìn)行相應(yīng)配置和初始化硬件資源,給多核板卡進(jìn)行內(nèi)存分配;
s202、對tcp流重組模塊進(jìn)行初始化和回調(diào)函數(shù)注冊;
s203、調(diào)用mpipe高速收包接口,peek方式收包進(jìn)行網(wǎng)絡(luò)數(shù)據(jù)包的接入。
進(jìn)一步的,所述tcp流重組模塊的執(zhí)行方法,具體如下:
s301、nids_next_special_mpipe函數(shù)處理收包數(shù)據(jù);
s302、注冊回調(diào)函數(shù)指針鏈表循環(huán)調(diào)用;
s303、process_tcp進(jìn)行tcp重組;
s304、tcp重組完成后進(jìn)入回調(diào)函數(shù)進(jìn)行郵件協(xié)議的分類判斷,根據(jù)端口走入不同的郵件還原模塊中。
進(jìn)一步的,所述步驟s4中郵件還原模塊包括pop3郵件還原模塊、stmp郵件還原模塊、imap郵件還原模塊、http郵件還原模塊。
進(jìn)一步的,所述pop3郵件還原模塊,具體執(zhí)行方法如下:
s401、符合pop3郵件協(xié)議的特征,進(jìn)入pop3郵件還原函數(shù)入口;
s402、判斷是否是客戶端數(shù)據(jù),如果是則郵件內(nèi)容獲取標(biāo)志位為1;如果不是則判斷協(xié)議命令是否為top或者retr,如果協(xié)議命令符合則郵件內(nèi)容獲取標(biāo)志位置為1;
s403、如果內(nèi)容獲取標(biāo)志位為1,則判斷郵件內(nèi)容結(jié)束符;
403、判斷郵件內(nèi)容結(jié)束符,如果有則內(nèi)容存入eml文件,如果沒有則緩存郵件內(nèi)容供下一次接收使用。
進(jìn)一步的,所述stmp郵件還原模塊,具體執(zhí)行方法如下:
s501、符合stmp郵件協(xié)議特征,進(jìn)入stmp郵件還原函數(shù)入口;
s502、判斷是否為服務(wù)器端數(shù)據(jù),如果是則進(jìn)一步判斷郵件內(nèi)容獲取標(biāo)志位是否為1;如果標(biāo)志位不為1則判斷協(xié)議命令是否為data,如果是data命令,則郵件內(nèi)容獲取標(biāo)志位置為1;
s503、郵件內(nèi)容獲取標(biāo)志位置為1的郵件,則進(jìn)一步判斷郵件內(nèi)容結(jié)束符;
s504、判斷郵件內(nèi)容結(jié)束符,如果有則內(nèi)容存入eml文件,如果沒有則緩存郵件內(nèi)容供下一次接收使用。
進(jìn)一步的,所述imap郵件還原模塊,具體執(zhí)行方法如下:
s601、符合imap郵件協(xié)議交互特征,進(jìn)入imap郵件還原函數(shù)入口;
s602、判斷是否為客戶端數(shù)據(jù),如果是則進(jìn)一步判斷郵件內(nèi)容獲取標(biāo)志位是否為1;如果不是客戶端數(shù)據(jù),則進(jìn)一步判斷協(xié)議命令,如果協(xié)議命令符合,則郵件內(nèi)容標(biāo)志位為1并且組合緩存出郵件內(nèi)容結(jié)束符;
s603、當(dāng)郵件內(nèi)容到達(dá)時(shí),判斷是否有結(jié)束符,有則進(jìn)行單封郵件的循環(huán)拆分和eml存儲,沒有則緩存郵件內(nèi)容。
進(jìn)一步的,所述http郵件還原模塊只針對于163郵箱的http網(wǎng)絡(luò)數(shù)據(jù)包的郵件還原,具體執(zhí)行方法如下:
s701、符合http郵件協(xié)議交互特征,進(jìn)入http郵件還原模塊入口;
s702、判斷是否為客戶端數(shù)據(jù),如果是客戶端數(shù)據(jù),則進(jìn)一步判斷是否為對應(yīng)標(biāo)志位;如果不是客戶端數(shù)據(jù),判斷是否為readmessage、listmessage、readmessage接口標(biāo)志位,如果是,delivermessage接口數(shù)據(jù)內(nèi)容url解碼,解碼內(nèi)容進(jìn)行mime格式的組合,將組合的mime結(jié)構(gòu)內(nèi)容寫入eml文件中;
s703、如果是客戶端數(shù)據(jù)且符合對應(yīng)的標(biāo)志位,則利用zlib庫解壓gzip內(nèi)容,對解壓內(nèi)容進(jìn)行判斷;
s704、判斷是否為readmessage接口標(biāo)志位,如果是,則填寫郵件mime結(jié)構(gòu)體的head部分;如果不是則進(jìn)一步判斷是否為readhtml接口標(biāo)志位,如果是readhtml標(biāo)志位,則填寫郵件mime結(jié)構(gòu)體的html部分,然后將組合的mime結(jié)構(gòu)內(nèi)容寫入eml文件;
s705、如果不是readhtml接口標(biāo)志位,則進(jìn)一步判斷是否為listmessage接口標(biāo)志位,如果是listmessage接口標(biāo)志位,則拆分出單封郵件內(nèi)容,組合mime結(jié)構(gòu)體head部,然后將組合的mime結(jié)構(gòu)內(nèi)容寫入eml文件。
相對于現(xiàn)有技術(shù),本發(fā)明所述的基于tilera多核板卡網(wǎng)絡(luò)數(shù)據(jù)包的郵件還原方法具有以下優(yōu)勢:
本發(fā)明所述的基于tilera多核板卡網(wǎng)絡(luò)數(shù)據(jù)包的郵件還原方法能夠利用多核tilera硬件高速收包和多核并行處理等性能實(shí)現(xiàn)對網(wǎng)絡(luò)數(shù)據(jù)包的郵件還原功能,根據(jù)所使用的tilera板卡配置(實(shí)際tilera板卡最高達(dá)到了100核的高速并行處理,在對性能要求更高的應(yīng)用場景下,可以選擇更高配置tilera板卡來滿足),目前本發(fā)明使用的是36核的tilera多核板卡,能最高實(shí)現(xiàn)10ge網(wǎng)絡(luò)數(shù)據(jù)包流量的36核并行處理郵件還原輸出eml文件,并且兼容pop3、stmp、imap和webmail中163郵箱的郵件還原功能,可并行處理多郵件協(xié)議業(yè)務(wù)或單獨(dú)處理單郵件協(xié)議業(yè)務(wù),在網(wǎng)路數(shù)據(jù)的郵件還原領(lǐng)域中使用tilera多核板卡該種硬件形態(tài)開發(fā)算法夯實(shí)了該實(shí)現(xiàn)技術(shù)手段。并且由于多核板卡的小巧性,能直接插在電腦的pci-e插槽中,在便攜式一體機(jī)中能直接安裝部署了郵件還原算法的硬件板卡,進(jìn)行隨時(shí)隨地的針對郵件的網(wǎng)絡(luò)偵查,在實(shí)際應(yīng)用中有很大應(yīng)用前景。
附圖說明
構(gòu)成本發(fā)明的一部分的附圖用來提供對本發(fā)明的進(jìn)一步理解,本發(fā)明的示意性實(shí)施例及其說明用于解釋本發(fā)明,并不構(gòu)成對本發(fā)明的不當(dāng)限定。在附圖中:
圖1為本發(fā)明實(shí)施例所述的基于tilera多核板卡網(wǎng)絡(luò)數(shù)據(jù)包的郵件還原方法整體框架圖;
圖2為本發(fā)明實(shí)施例所述的tilera多核板卡初始化和收包模塊流程圖;
圖3為本發(fā)明實(shí)施例所述的tcp流重組模塊模塊流程圖;
圖4為本發(fā)明實(shí)施例所述的pop3郵件還原模塊流程圖;
圖5為本發(fā)明實(shí)施例所述的stmp郵件還原模塊流程圖;
圖6為本發(fā)明實(shí)施例所述的imap郵件還原模塊流程圖;
圖7為本發(fā)明實(shí)施例所述的http郵件還原模塊流程圖。
具體實(shí)施方式
需要說明的是,在不沖突的情況下,本發(fā)明中的實(shí)施例及實(shí)施例中的特征可以相互組合。
在本發(fā)明的描述中,需要理解的是,術(shù)語“中心”、“縱向”、“橫向”、“上”、“下”、“前”、“后”、“左”、“右”、“豎直”、“水平”、“頂”、“底”、“內(nèi)”、“外”等指示的方位或位置關(guān)系為基于附圖所示的方位或位置關(guān)系,僅是為了便于描述本發(fā)明和簡化描述,而不是指示或暗示所指的裝置或元件必須具有特定的方位、以特定的方位構(gòu)造和操作,因此不能理解為對本發(fā)明的限制。此外,術(shù)語“第一”、“第二”等僅用于描述目的,而不能理解為指示或暗示相對重要性或者隱含指明所指示的技術(shù)特征的數(shù)量。由此,限定有“第一”、“第二”等的特征可以明示或者隱含地包括一個(gè)或者更多個(gè)該特征。在本發(fā)明的描述中,除非另有說明,“多個(gè)”的含義是兩個(gè)或兩個(gè)以上。
在本發(fā)明的描述中,需要說明的是,除非另有明確的規(guī)定和限定,術(shù)語“安裝”、“相連”、“連接”應(yīng)做廣義理解,例如,可以是固定連接,也可以是可拆卸連接,或一體地連接;可以是機(jī)械連接,也可以是電連接;可以是直接相連,也可以通過中間媒介間接相連,可以是兩個(gè)元件內(nèi)部的連通。對于本領(lǐng)域的普通技術(shù)人員而言,可以通過具體情況理解上述術(shù)語在本發(fā)明中的具體含義。
下面將參考附圖并結(jié)合實(shí)施例來詳細(xì)說明本發(fā)明。
如圖1所示,基于tilera多核板卡網(wǎng)絡(luò)數(shù)據(jù)包的郵件還原方法,其特征在于,包括以下步驟:
s1、郵件還原前需要對開發(fā)環(huán)境進(jìn)行部署,包括tilera多核板卡與機(jī)箱硬件的連接,以及軟件系統(tǒng)的安裝;
s2、開發(fā)環(huán)境部署后,進(jìn)行郵件還原,首先基于tilera多核板卡進(jìn)行初始化配置,啟動使用的硬件資源并調(diào)用收包接口進(jìn)行收包;
s3、將收到的數(shù)據(jù)包進(jìn)行tcp流重組模塊;
s4、最后根據(jù)端口分類進(jìn)入到不同的郵件還原模塊進(jìn)行郵件還原操作。
其中,所述步驟s1中開發(fā)環(huán)境部署,具體方法如下:
s101、將tilera多核板卡插入便攜式一體機(jī)的機(jī)箱pcie插槽上,固定好多核板卡后,將多核板卡的一個(gè)或不多于四個(gè)光口通過光模塊和光纖進(jìn)行連接,網(wǎng)絡(luò)數(shù)據(jù)流通過光纖進(jìn)入多核板卡的光口形成數(shù)據(jù)通路,tilera多核板卡的光口支持ge和xge,目前選擇xge的流量即10ge;
s102、在電腦上安裝centos6.5的liunx操作系統(tǒng),并且安裝tilera開發(fā)環(huán)境版本mde4.3.3;
s103、通過tilera的登錄命令tile-monitor來登錄到tilera板卡內(nèi)部的liunx系統(tǒng),在該環(huán)境下開發(fā)部署郵件還原程序代碼。
其中,所述步驟s1中,所述開發(fā)環(huán)境部署后,對串口進(jìn)行調(diào)試時(shí),將多核板卡的串口調(diào)試口通過調(diào)試線連接到電腦的usb口上,通過tile-console命令登錄到串口調(diào)試輸出端。
如圖2所示,所述tilera多核板卡初始化和收包模塊的執(zhí)行方法,具體如下:
s201、通過接收用戶設(shè)置參數(shù)進(jìn)行相應(yīng)配置和初始化硬件資源,給多核板卡進(jìn)行內(nèi)存分配;
s202、對tcp流重組模塊進(jìn)行初始化和回調(diào)函數(shù)注冊;
s203、調(diào)用mpipe高速收包接口,peek方式收包進(jìn)行網(wǎng)絡(luò)數(shù)據(jù)包的接入。
該模塊主要通過接收用戶設(shè)置參數(shù)進(jìn)行相應(yīng)配置和初始化硬件資源,給多核板卡的notifrng、notifgroup、buckets、queues等進(jìn)行內(nèi)存分配,同時(shí)對tcp重組的部分進(jìn)行初始化和回調(diào)函數(shù)注冊,最后調(diào)用mpipe高速收包接口,peek方式收包進(jìn)行網(wǎng)絡(luò)數(shù)據(jù)包的接入。
圖3為具體流程圖,所述tcp流重組模塊的執(zhí)行方法,方法如下:
s301、nids_next_special_mpipe函數(shù)處理收包數(shù)據(jù);
s302、注冊回調(diào)函數(shù)指針鏈表循環(huán)調(diào)用;
s303、process_tcp進(jìn)行tcp重組;
s304、tcp流重組完成后進(jìn)入回調(diào)函數(shù)進(jìn)行郵件協(xié)議的分類判斷,根據(jù)端口走入不同的郵件還原模塊中。
主要借助于開源庫libnids的tcp流重組功能,將開源代碼進(jìn)行重構(gòu)修改,添加與mpipe的對接接口,將網(wǎng)絡(luò)數(shù)據(jù)包流量引入tcp流重組模塊,同時(shí)對libnids的數(shù)據(jù)結(jié)構(gòu)進(jìn)行修改,加入數(shù)據(jù)還原算法需要用到的用戶字段,方便后續(xù)處理。tcp流重組完成后進(jìn)入回調(diào)函數(shù)進(jìn)行郵件協(xié)議的分類判斷,根據(jù)端口走入不同的郵件還原模塊算法中。
其中,所述步驟s2中郵件還原模塊包括pop3郵件還原模塊、stmp郵件還原模塊、imap郵件還原模塊、http郵件還原模塊。
如圖4所示,所述pop3郵件還原模塊,根據(jù)pop3郵件協(xié)議的特征,進(jìn)行算法設(shè)計(jì),pop3郵件協(xié)議中服務(wù)端發(fā)送top或retr協(xié)議命令時(shí)客戶端才會有郵件數(shù)據(jù)發(fā)送具體執(zhí)行方法如下:
s401、符合pop3郵件協(xié)議的特征,進(jìn)入pop3郵件還原函數(shù)入口;
s402、判斷是否是客戶端數(shù)據(jù),如果是則郵件內(nèi)容獲取標(biāo)志位為1;如果不是則判斷協(xié)議命令是否為top或者retr,如果協(xié)議命令符合則郵件內(nèi)容獲取標(biāo)志位置為1;
s403、如果內(nèi)容獲取標(biāo)志位為1,則判斷郵件內(nèi)容結(jié)束符;
403、判斷郵件內(nèi)容結(jié)束符,如果有則內(nèi)容存入eml文件,如果沒有則緩存郵件內(nèi)容供下一次接收使用。
如圖5所示,所述stmp郵件還原模塊,根據(jù)stmp郵件協(xié)議特征,進(jìn)行算法設(shè)計(jì),該算法和pop3類似,不同的是對我們有用的stmp的協(xié)議命令和郵件內(nèi)容數(shù)據(jù)流都是服務(wù)端發(fā)送過來的,且獲取郵件內(nèi)容的協(xié)議命令是data,具體執(zhí)行方法如下:
s501、符合stmp郵件協(xié)議特征,進(jìn)入stmp郵件還原函數(shù)入口;
s502、判斷是否為服務(wù)器端數(shù)據(jù),如果是則進(jìn)一步判斷郵件內(nèi)容獲取標(biāo)志位是否為1;如果標(biāo)志位不為1則判斷協(xié)議命令是否為data,如果是data命令,則郵件內(nèi)容獲取標(biāo)志位置為1;
s503、郵件內(nèi)容獲取標(biāo)志位置為1的郵件,則進(jìn)一步判斷郵件內(nèi)容結(jié)束符;
s504、判斷郵件內(nèi)容結(jié)束符,如果有則內(nèi)容存入eml文件,如果沒有則緩存郵件內(nèi)容供下一次接收使用。
如圖6所示,所述imap郵件還原模塊,該模塊根據(jù)imap郵件協(xié)議交互特征,帶用fetch協(xié)議命令,并攜帶參數(shù)body.peek[]或body.peek[header]等類似請求獲取郵件全部內(nèi)容或部分內(nèi)容的協(xié)議命令時(shí),記錄進(jìn)入郵件內(nèi)容還原狀態(tài),并且組合緩存出郵件內(nèi)容結(jié)束符,當(dāng)郵件內(nèi)容到達(dá)時(shí),判斷是否有結(jié)束符,有則進(jìn)行單封郵件的循環(huán)拆分和eml存儲,沒有則緩存郵件內(nèi)容。具體執(zhí)行方法如下:
s601、符合imap郵件協(xié)議交互特征,進(jìn)入imap郵件還原函數(shù)入口;
s602、判斷是否為客戶端數(shù)據(jù),如果是則進(jìn)一步判斷郵件內(nèi)容獲取標(biāo)志位是否為1;如果不是客戶端數(shù)據(jù),則進(jìn)一步判斷協(xié)議命令,如果協(xié)議命令符合,則郵件內(nèi)容標(biāo)志位為1并且組合緩存出郵件內(nèi)容結(jié)束符;
s603、當(dāng)郵件內(nèi)容到達(dá)時(shí),判斷是否有結(jié)束符,有則進(jìn)行單封郵件的循環(huán)拆分和eml存儲,沒有則緩存郵件內(nèi)容。
如圖7所示,所述http郵件還原模塊目前只針對163郵箱的http網(wǎng)絡(luò)數(shù)據(jù)包的郵件還原,根據(jù)郵箱操作產(chǎn)生的網(wǎng)絡(luò)數(shù)據(jù)包分析得到郵箱操作的協(xié)議命令格式:
a)當(dāng)用戶點(diǎn)擊“收件箱”時(shí)顯示郵件列表操作,對應(yīng)http協(xié)議中請求url為post方法并且包含"&func=mbox:listmessage"標(biāo)識;
b)當(dāng)用戶點(diǎn)擊某個(gè)郵件查看郵件內(nèi)容時(shí),對應(yīng)http協(xié)議中兩個(gè)請求url,一個(gè)是post方法并且包含”&func=mbox:readmessage”和"&action=read"標(biāo)識,包含郵件頭部信息;另一個(gè)是get方法并且包含"read/readhtml.jsp?"標(biāo)識,包含郵件以html形式展示的郵件內(nèi)容;
c)當(dāng)用戶點(diǎn)擊發(fā)送郵件時(shí),對應(yīng)http協(xié)議中請求url為post方法并且包含"&func=mbox:compose"和"&action=deliver"標(biāo)識;
根據(jù)這些接口類型分配不同的接口標(biāo)志位,當(dāng)分析url時(shí),識別到對應(yīng)接口時(shí)置位相應(yīng)接口標(biāo)志位,當(dāng)郵件內(nèi)容到達(dá)時(shí)進(jìn)行分接口的解析,首先需要利用zlib進(jìn)行g(shù)zip壓縮的內(nèi)容的解壓縮,其中delivermessage發(fā)送郵件接口則進(jìn)行的操作是被url轉(zhuǎn)碼的內(nèi)容進(jìn)行解碼,然后再對內(nèi)容解析抽取mime格式中的from、to、subject等字段信息進(jìn)行mime格式的組合,最后將mime格式寫入eml文件中。
具體執(zhí)行方法為:
具體執(zhí)行方法為:
s701、符合http郵件協(xié)議交互特征,進(jìn)入http郵件還原模塊入口;
s702、判斷是否為客戶端數(shù)據(jù),如果是客戶端數(shù)據(jù),則進(jìn)一步判斷是否為對應(yīng)標(biāo)志位是否為content-encoding:gzip\r\n\r\n和結(jié)束符0\r\n\r\n;如果不是客戶端數(shù)據(jù),判斷是否為readmessage、listmessage、readmessage接口標(biāo)志位,如果是,delivermessage接口數(shù)據(jù)內(nèi)容url解碼,解碼內(nèi)容進(jìn)行mime格式的組合,將組合的mime結(jié)構(gòu)內(nèi)容寫入eml文件中;
s703、如果是客戶端數(shù)據(jù)且符合對應(yīng)的標(biāo)志位,則利用zlib庫解壓gzip內(nèi)容,對解壓內(nèi)容進(jìn)行判斷;
s704、判斷是否為readmessage接口標(biāo)志位,如果是,則填寫郵件mime結(jié)構(gòu)體的head部分;如果不是則進(jìn)一步判斷是否為readhtml接口標(biāo)志位,如果是readhtml標(biāo)志位,則填寫郵件mime結(jié)構(gòu)體的html部分,然后將組合的mime結(jié)構(gòu)內(nèi)容寫入eml文件;
s705、如果不是readhtml接口標(biāo)志位,則進(jìn)一步判斷是否為listmessage接口標(biāo)志位,如果是listmessage接口標(biāo)志位,則拆分出單封郵件內(nèi)容,組合mime結(jié)構(gòu)體head部,然后將組合的mime結(jié)構(gòu)內(nèi)容寫入eml文件。
以上所述僅為本發(fā)明的較佳實(shí)施例而已,并不用以限制本發(fā)明,凡在本發(fā)明的精神和原則之內(nèi),所作的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。