我目前正在开发一个简单的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