現在使用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
{
if(recbuf[i+0x13]==0)
break;
name[i]=recbuf[i+0x13];
}
for(i=0;i
{
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文件
(未完,將繼續整理關於FoxMail發件箱收件箱信息提取的研究)