首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC++

FoxMail 4.x/5.x 通訊錄與郵件箱文件格式深度解析(.ind/.box 結構、讀寫代碼)

     編輯:VC++

前言

FoxMail 作為國產經典郵件客戶端,未提供官方 API。本文基於 FoxMail 4.2/5.0 實測,詳細記錄其核心數據文件結構:.ind (索引) 與 .box (內容) 的二進制佈局,並提供 C 風格遍歷讀取與追加寫入代碼片段,供二次開發、數據遷移、備份工具參考。

通用存儲模型

所有郵箱(收件箱、發件箱、草稿箱等)與通訊錄均遵循 **雙文件模式**:

  • `.ind` 索引文件:固定長度記錄,存儲元數據(主題、發件人、時間、狀態標誌、**內容在 .box 中的起始偏移量與長度**)。
  • `.box` 內容文件:變長文本塊,順序存儲完整郵件源文本 (RFC822) 或通訊錄詳細字段。

通訊錄 Address.ind 結構詳細

文件頭 (0x00~0x3F, 64 bytes)

偏移長度含義
0x051 byte記錄總數 (Record Count)
0x12~0x2116 bytes通訊錄名稱 (ANSI, 以 \0 結尾)

記錄區 (從 0x40 開始,每條 0xB0 = 176 bytes)

相對偏移長度含義
0x001 byte記錄序號 (1-based)
0x041 byte刪除標誌 (1=已刪除,實為軟刪除)
0x05~0x062 bytes (Little Endian)內容在 .box 中的起始偏移量 (高位在前? 實測為低位在前,見代碼)
0x09~0x0A2 bytes內容長度 + 0x156 (總記錄長度修正值)
0x111 byte群組標誌 (1=群組記錄)
0x121 byte姓名長度 (max 0x20)
0x13~0x3232 bytes姓名內容
0x331 byteEmail 長度 (max 0x40)
0x34~0x7364 bytesEmail 內容

通訊錄 Address.box 結構

每條記錄以 _____________S\n (13 個下劃線 + 'S' + 0x0D 0x0A) 開頭,隨後為 **字段名:值** 文本行,每行以 \r\n 結尾,最後以雙 \r\n 結束。字段順序固定:

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

格式:字段名:值\r\n,值可為空行。最後一個字段後額外加兩個 \r\n。

實戰代碼:遍歷讀取姓名與 Email (C 風格)

bool GoAll(const char* szIndFile) {
    FILE* pf = fopen(szIndFile, "rb");
    if (!pf) return false;

    fseek(pf, 0x40, SEEK_SET); // 跳過文件頭
    char recbuf[0xB1];
    char name[0x21], email[0x41];

    while (!feof(pf)) {
        size_t read = fread(recbuf, 1, 0xB0, pf);
        if (read != 0xB0) break;

        if (recbuf[0x04] == 1) continue; // 已刪除
        if (recbuf[0x11] == 1) continue; // 群組記錄跳過

        // 提取姓名 (0x13 起,長度由 0x12 指示,但實測以 \0 結尾)
        int i = 0;
        for (; i < 0x20 && recbuf[0x13 + i]; ++i) name[i] = recbuf[0x13 + i];
        name[i] = '\0';

        // 提取 Email (0x34 起)
        i = 0;
        for (; i < 0x40 && recbuf[0x34 + i]; ++i) email[i] = recbuf[0x34 + i];
        email[i] = '\0';

        // TODO: 處理 name, email (如寫入 SQLite、導出 CSV、同步到 LDAP)
        printf("Name: %-20s  Email: %s\n", name, email);
    }
    fclose(pf);
    return true;
}

實戰代碼:向通訊錄追加一條記錄 (核心邏輯)


// 1. 讀取文件頭
char headbuf[0x40];
fseek(pf, 0, SEEK_SET);
fread(headbuf, 1, 0x40, pf);

// 2. 修改記錄數
unsigned char count = headbuf[0x05] + 1;
headbuf[0x05] = count;

// 3. 構造新記錄 (176 bytes)
char recbuf[0xB0] = {0};
recbuf[0x00] = count;           // 序號
recbuf[0x04] = 0;               // 未刪除
recbuf[0x11] = 0;               // 非群組

// 姓名
strncpy(recbuf + 0x13, "張三", 0x20);
recbuf[0x12] = strlen("張三");

// Email
strncpy(recbuf + 0x34, "zhangsan@example.com", 0x40);
recbuf[0x33] = strlen("zhangsan@example.com");

// 4. 計算 .box 偏移量與長度
// 假設已構造好 boxBuf (以 _____________S\r\n 開頭...雙\r\n結尾)
long boxOffset = currentBoxFileSize; // 追加位置
long boxLen = strlen(boxBuf) + 0x156; // 加上修正值

// 寫入偏移量 (Little Endian, 0x05,0x06)
recbuf[0x05] = boxOffset & 0xFF;
recbuf[0x06] = (boxOffset >> 8) & 0xFF;
// 寫入長度 (0x09,0x0A)
recbuf[0x09] = boxLen & 0xFF;
recbuf[0x0A] = (boxLen >> 8) & 0xFF;

// 5. 寫回 .ind (文件頭 + 新記錄) 並追加 .box
fseek(pf, 0, SEEK_SET);
fwrite(headbuf, 1, 0x40, pf);
fseek(pf, 0x40 + (count-1)*0xB0, SEEK_SET);
fwrite(recbuf, 1, 0xB0, pf);
fclose(pf);

FILE* pbox = fopen("Address.box", "ab");
fwrite(boxBuf, 1, strlen(boxBuf), pbox);
fclose(pbox);

郵件箱 同樣遵循 .ind/.box 模式

  • 收件箱:Inbox.ind / Inbox.box
  • 發件箱:Outbox.ind / Outbox.box
  • 已發送:Sent.ind / Sent.box
  • 垃圾箱:Trash.ind / Trash.box

郵件 `.ind` 記錄結構與通訊錄類似,但字段不同:包含郵件主題、發件人、收件人、日期、大小、附件標誌、已讀標誌、優先級、在 .box 中的偏移/長度等。`.box` 中存儲完整原始郵件源碼 (Headers + Body),可直接用 RFC822 解析庫處理。

避坑指南

  1. 編碼問題:FoxMail 4.x/5.x 內部使用系統預設 ANSI 編碼 (中文環境為 GBK/CP936);讀寫時需注意轉換為 UTF-8。
  2. 軟刪除:用戶「刪除」郵件/聯系人僅置標誌位,實際數據保留在 .box 中,可實現「撤銷刪除」功能。
  3. 並發風險:FoxMail 運行時會鎖定文件;讀寫前需確保 FoxMail 完全退出,或使用 Volume Shadow Copy (VSS) 讀取快照。
  4. 版本差異:FoxMail 6.0+ (Unicode 版) 文件結構發生重大變化 (改用 SQLite),本文結構**不適用**。

應用場景

  • 企業郵件歸檔合規:批量導出 .box 內容轉存為 EML/PDF。
  • 通訊錄同步:雙向同步 FoxMail ↔ AD/LDAP/Google Contacts。
  • 數據救援:用戶誤刪郵件後,直接掃描 .box 恢復軟刪除記錄。
  • 客製化報表:統計郵件往來頻次、關鍵詞分析、附件類型分布。

掌握 FoxMail 文件格式,即掌握了其數據的「鑰匙」。雖然官方無 API,但結構穩定、邏輯清晰,配合上述代碼模板,可快速構建各類集成工具。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved