我目前正在開發一個簡單的 IMAP 用戶端,當我呼叫 imap_getmailboxes() 時,我在信箱物件的 attributes 屬性中收到不同的值,問題是我如何操作這些屬性以獲得有意義的值,
如果您努力尋找此問題的解決方案,您將
找不到任何有用的文件來解決這個問題,讓我們仔細看看這個問題。
當我針對不同的 IMAP 伺服器呼叫 imap_getmailboxes() 時,我得到以下屬性值
[attributes] => 9
[attributes] => 1
[attributes] => 64
[attributes] => 32
[attributes] => 40
文件告訴我們,我們要根據四個常數檢查這些屬性,這些常數是
LATT_NOINFERIORS
LATT_NOSELECT
LATT_MARKED
LATT_UNMARKED
這些常數的值為
LATT_NOINFERIORS = 1
LATT_NOSELECT = 2
LATT_MARKED = 4
LATT_UNMARKED = 8
您可以透過 echo 指令顯示每個常數的值來得到這個結果,但可惜的是,文件並沒有說明如何使用這些常數來檢查屬性。經過長時間的搜尋,我在 c-client 的原始碼中找到了答案。
(您可以從 ftp://ftp.cac.washington.edu/imap/ 取得原始碼)
在 \src\c-client 資料夾下,您可以找到 mail.h 檔,打開它,您會看到以下內容:
/* 階層中的終端節點 */
#define LATT_NOINFERIORS (long) 0x1
/* 名稱無法選取 */
#define LATT_NOSELECT (long) 0x2
/* 自上次存取後已變更 */
#define LATT_MARKED (long) 0x4
/* 自上次變更後已存取 */
#define LATT_UNMARKED (long) 0x8
/* 名稱具有指向遠端信箱的參考 */
#define LATT_REFERRAL (long) 0x10
/* 具有可選取的子項目 */
#define LATT_HASCHILDREN (long) 0x20
/* 沒有可選取的子項目 */
#define LATT_HASNOCHILDREN (long) 0x40
如您所見,這裡是我們原先的四個常數,以及另外三個常數:
LATT_REFERRAL
LATT_HASCHILDREN
LATT_HASNOCHILDREN
那麼,這三個屬性的值是多少呢?
LATT_REFERRAL 0x10 = 二進位制的 00010000,位元遮罩值為 2^4 = 16,依此類推,或者簡單地 echo 這個常數即可取得其值。因此:
LATT_REFERRAL = 16
LATT_HASCHILDREN = 32
LATT_HASNOCHILDREN = 64
最後,完整的常數列表如下:
LATT_NOINFERIORS = 1
LATT_NOSELECT = 2
LATT_MARKED = 4
LATT_UNMARKED = 8
LATT_REFERRAL = 16
LATT_HASCHILDREN = 32
LATT_HASNOCHILDREN = 64
好的,讓我們回到屬性。
[attributes] => 9
[attributes] => 1
[attributes] => 64
[attributes] => 32
[attributes] => 40
[attributes] => 9 這表示它是 LATT_UNMARKED 和 LATT_NOINFERIORS,1+8 =9
[attributes] => 1 這表示 LATT_NOINFERIORS
[attributes] => 64 這表示 LATT_HASNOCHILDREN
[attributes] => 32 這表示 LATT_HASCHILDREN
[attributes] => 40 這表示 LATT_HASCHILDREN 和 LATT_UNMARKED,32+8=40
這就像 Linux 的檔案權限,7 代表讀取、寫入和執行,4+2+1,讀取=4,寫入=2,執行=1
這就是我的發現,希望這能有所幫助。
Mohamed Abbas
Nileweb Egypt