關於foxmail的研究

現在使用FoxMail的用戶越來越多了,但是FoxMail卻不像OutLook一樣給編程人員提供開發接口。我認爲這對一個好的軟件的推廣來說是很不利的。前幾個月小弟由於開發需要對FoxMail進行了以下研究,這幾天閒下來將材料整理了一下,供大家參考。我使用FoxMail4.2進行研究,但是在FoxMail5.0推出後,我也進行了測試,仍然使用。

FoxMail的數據保存,都是由兩個文件組成 .Ind 和 .Box的文件,Ind 文件主要記錄簡單信息,以及詳細信息在.Box文件中的起始位置。

地址簿:

默認情況下,FoxMail的地址簿由兩個文件組成,Address.ind 和 Address.box。

Address.Ind文件

文件頭的範圍爲00H-39H,共64個字節。

05H保存紀錄的個數,12H-21H記錄地址薄名稱。

記錄部分40H開始是第一條記錄,每條記錄長B0H

每條記錄的00H是記錄號(從01開始順序編號),04H是刪除標記,該字節爲1表明此記錄被用戶刪除(由此可見在FoxMail中刪除的信息沒有被真正的刪除)

05H06H紀錄在.BOX中的地址如 [05H]=01,[06H]=EA 那麼該項紀錄的詳細信息被保存在Address.Box文件中起始位置爲01FA

09H0AH此記錄在.Box文件中詳細信息的字節數目加上156H(記錄整條記錄在Box文件中的總長度)

11H是組記錄,該字節爲1表明此記錄爲一條組記錄;(我沒有對此項進行詳細研究)

12H是此項紀錄名稱的長度,最大爲20H;

13H-32H是此項紀錄名稱的內容

33H是郵件地址長度,最大爲40H

34H-73H是郵件地址內容

Address.Box文件

每條記錄由“_____________S”開始,後加一回車符(0A0D)

緊接着是詳細信息,分別由以下幾項組成(按順序排列)

Emails

Mobile

PagerNum

OICQ

ICQ

HomePage

Sex

Birthday

FmCountry

FmProvince

FmCity

FmPostcode

FmStreetAddr

HomeTel

HomeTel2

FmFax

Company

OfCountry

OfProvince

OfCity

PostCode

HomeAddress

OfHomePage

OfPosition

OfDepartment

OfficeTel

OfficeTel2

Fax

構造格式:名稱 + 冒號 + 0A0D + 信息內容 + 0A0D

最後一項構造完成 要加入2個 0A0D

實例1:

從FoxMail中遍歷地址簿聯繫人姓名和EMail信息:

bool GoAll(char *szFileNameOfInd)

char headbuf[0x41];        // 頭buf

char recbuf[0xb1];           // 內容buf

        FILE* pf=fopen(szFileNameOfInd,"rb");

        fseek(pf,0x40,SEEK_SET);        // 到項目開始

        while(!feof(pf))

        {

                char name[0x21],email[0x41]; // 定義存儲姓名和email的字符數組

                for(i=0;i<0x21;i++)

                        name[i]=“/0“;

                for(i=0;i<0x41;i++)

                        email[i]=“/0“;

                fread(recbuf,1,0xb0,pf);                // 讀取一條記錄

                if(recbuf[0x4]==1)                              // 判斷刪除標誌

                {

                       continue;

               }

                if(recbuf[0x11]==1)                     // 判斷組標誌

                {

                       continue;

               }

                for(i=0;i<recbuf[0x21];i++)             // 獲取此條目的聯繫人姓名

                {

                        if(recbuf[i+0x13]==0)

                                break;

                        name[i]=recbuf[i+0x13];

               }

                for(i=0;i<recbuf[0x33];i++)             // 獲取此條目的聯繫人EMail

                {

                        if(recbuf[i+0x34]==0)

                                break;

                        email[i]=recbuf[i+0x34];

               }

                //此處添加處理name(收件人名),email(收件人地址)的程序

                        return true;

   }

 

實例2:

向地址簿中添加一條記錄信息,沒有給出全部代碼。

 

1.      得到文件頭

BOOL GetIndFileHead(char* szheadbuf)         // 得到文件頭部的函數

{

        fseek(FoxWriter_pf_addr,0x0,SEEK_SET);

        long len=0;

        len=fread(szheadbuf,1,0x40,FoxWriter_pf_addr);

        if(len==0)

                return FALSE;

        return TRUE;

}

 

2.      修改項目數;

int itemcount=szheadbuf[0x5];

itemcount++;

szheadbuf[0x5]=itemcount; 

3.      修改項目代號

szbuf[0x0]=itemcount;

4.      創建項目名稱

szbuf[0x12]=strlen(strItemName);

for(i=0;i<0x20;i++)

        szbuf[i+0x13]=strItemName[i];

5.      創建項目email

szbuf[0x33]=strlen(strEmails);

        for(i=0;i<0x40;i++)

        szbuf[i+0x34]=strEmails[i]; 

6.      構造Box文件buf

(略)

7.      創建項目對Box文件指針

char* pbuf=szbuf;

        pbuf++;

        short* pshbuf=(short*)pbuf;

    pshbuf[0x2]=point;

8.      創建項目字數值

long len=strlen(szBoxbuf) 

len+=0x156; 

9.      保存Ind和Box文件

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章