|
imap_getmailboxes
Read the list of mailboxes, returning detailed information on each one
(PHP 4, PHP 5)
Example 1052. imap_getmailboxes() example<?php Code Examples / Notes » imap_getmailboxesfoom
The list of mailbox attributes in this document is very misleading. In particular the explanation of noinferiors is just wrong. It does not mean that the mailbox currently has no children, it means that it *cannot* have children ever. Also, it is untrue that marked and unmarked are only used by UW-IMAP. They are in the official IMAP specification and are used by at least Courier-imap as well. One thing to watch out for, however, is broken IMAP servers which do send \Noinferiors when they mean that there are currently no children. From the IMAP4rev1 specs (RFC 2060): \Noinferiors It is not possible for any child levels of hierarchy to exist under this name; no child levels exist now and none can be created in the future. \Noselect It is not possible to use this name as a selectable mailbox. \Marked The mailbox has been marked "interesting" by the server; the mailbox probably contains messages that have been added since the last time the mailbox was selected. \Unmarked The mailbox does not contain any additional messages since the last time the mailbox was selected. ned
Just to simplify what Mohamed Abbas said to get right to the heart of the matter: You have 7 constants to test against: LATT_NOINFERIORS, LATT_NOSELECT, LATT_MARKED, LATT_UNMARKED, LATT_REFERRAL, LATT_HASCHILDREN, and LATT_HASNOCHILDREN. You do a bitmask test against attributes to test the value; in in PHPese: if ($val->attributes & LATT_HASNOCHILDREN) { echo 'this has children'; } Don't make it more complicated than you have to. ad-rotator.com
In case you print_r() or var_dump() the object and see an int for attribute, these are the constant integers for the bitmask. 1 LATT_NOINFERIORS 2 LATT_NOSELECT 4 LATT_MARKED 8 LATT_UNMARKED emielbom
i was looking for a function to test the attributes. and it was hard to find an answer or code. Maybe there is a function availeble, but i couldn't find it. the first function: returns all mailboxes in on the server The second function: returns a bitstring from the attr_number returned by getmailboxes() The tirth function: returns an array with the active attributes on the specific mailbox Last Line: is a combination of the functions: the output is, any map witch can hold no mail but only sub boxes... function getFolders($mailbox, $serverString) { $list = imap_getmailboxes($mailbox, $serverString, "*"); if (is_array($list)) { foreach ($list as $key => $val) { $mapname = str_replace($serverString, "", imap_utf7_decode($val->name)); if ($mapname[0] != ".") { $list_folders[$key]['name'] = $mapname; $list_folders[$key]['delimiter'] = $val->delimiter; $list_folders[$key]['attributes'] = $val->attributes; } } } else { echo "imap_getmailboxes failed: " . imap_last_error() . "\n"; } return $list_folders; } function IntToBin($number) { $BitWaarde = 1; $IntNum = $number; $BinString = ""; if ($IntNum > 0) { // bepaal de max bitwaarde aan de hand van $IntNum while ($IntNum > $BitWaarde) { $BitWaarde = $BitWaarde * 2; } // maken van een binaire string. while ($BitWaarde >= 1 ) { if ($IntNum < $BitWaarde) { if ($BinString != "") $BinString .= "0"; } else { $BinString .= "1"; $IntNum = $IntNum-$BitWaarde; } $BitWaarde = $BitWaarde / 2; } } return $BinString; } function Attributes($BinString) { $BinInt = (int)$BinString; if ($BinInt >=1000){ $setAttribute['LATT_UNMARKED'] = true; $BinInt = $BinInt-1000; } else $setAttribute['LATT_UNMARKED'] = false; if ($BinInt >=100){ $setAttribute['LATT_MARKED'] = true; $BinInt = $BinInt-100; } else $setAttribute['LATT_MARKED'] = false; if ($BinInt >=10){ $setAttribute['LATT_NOSELECT'] = true; $BinInt = $BinInt-10; } else $setAttribute['LATT_NOSELECT'] = false; if ($BinInt >=1){ $setAttribute['LATT_NOINFERIORS'] = true; $BinInt = $BinInt-1; } else $setAttribute['LATT_NOINFERIORS'] = false; return $setAttribute; } foreach (getFolders($mailbox, $config['Server_string']) as $key => $val) { $Attr = Attributes(IntToBin((int)$val['attributes'])); if (!$Attr['LATT_NOINFERIORS']) { echo "<option value='".$val['name']."'>".$val['name']."</option>"; } } mohamed abbas mabbas_xyz
i am currently develop a simple IMAP client, when i call imap_getmailboxes() i receive a different values in attributes property of the mailbox object the problem is how can i manipulate these attributes to get a meaningful value, if you make a hard search to find a solution for this, you will not find any useful documents for this problem, let us take a closer look for this problem. when i call imap_getmailboxes() against different IMAP servers i got these attribute values [attributes] => 9 [attributes] => 1 [attributes] => 64 [attributes] => 32 [attributes] => 40 the documentation tell us that we check this attributes against four constants, these contents are LATT_NOINFERIORS LATT_NOSELECT LATT_MARKED LATT_UNMARKED the value of these constants are LATT_NOINFERIORS = 1 LATT_NOSELECT = 2 LATT_MARKED = 4 LATT_UNMARKED = 8 you can got this result by echo each constant, unfortunately the documentation not explain how we can check the attributes against the constants, after a long time of searching i find the answer in source code of c-client (you can get the source from ftp://ftp.cac.washington.edu/imap/) under \src\c-client you will find mail.h open it and you will find this /* terminal node in hierarchy */ #define LATT_NOINFERIORS (long) 0x1 /* name can not be selected */ #define LATT_NOSELECT (long) 0x2 /* changed since last accessed */ #define LATT_MARKED (long) 0x4 /* accessed since last changed */ #define LATT_UNMARKED (long) 0x8 /* name has referral to remote mailbox */ #define LATT_REFERRAL (long) 0x10 /* has selectable inferiors */ #define LATT_HASCHILDREN (long) 0x20 /* has no selectable inferiors */ #define LATT_HASNOCHILDREN (long) 0x40 as you notice here these are our four constants and three additional constants LATT_REFERRAL LATT_HASCHILDREN LATT_HASNOCHILDREN then what is the value of these 3 attributes LATT_REFERRAL 0x10 = 00010000 in binary, the bitmask value is 2^4 = 16 and so on, or simply echo this constant to get the value, then LATT_REFERRAL = 16 LATT_HASCHILDREN = 32 LATT_HASNOCHILDREN = 64 finally the full list of constants will be LATT_NOINFERIORS = 1 LATT_NOSELECT = 2 LATT_MARKED = 4 LATT_UNMARKED = 8 LATT_REFERRAL = 16 LATT_HASCHILDREN = 32 LATT_HASNOCHILDREN = 64 ok let's back to our attributes [attributes] => 9 [attributes] => 1 [attributes] => 64 [attributes] => 32 [attributes] => 40 [attributes] => 9 this mean it's LATT_UNMARKED and LATT_NOINFERIORS 1+8 =9 [attributes] => 1 this mean LATT_NOINFERIORS [attributes] => 64 this mean LATT_HASNOCHILDREN [attributes] => 32 this mean LATT_HASCHILDREN [attributes] => 40 this mean LATT_HASCHILDREN and LATT_UNMARKED 32+8=40 this just like linux file permission 7 mean read, write, and execute 4+2+1 read=4 write=2 execute=1 that is what i found, i hope this can help Mohamed Abbas Nileweb Egypt |
Change Languageimap_8bit imap_alerts imap_append imap_base64 imap_binary imap_body imap_bodystruct imap_check imap_clearflag_full imap_close imap_createmailbox imap_delete imap_deletemailbox imap_errors imap_expunge imap_fetch_overview imap_fetchbody imap_fetchheader imap_fetchstructure imap_get_quota imap_get_quotaroot imap_getacl imap_getmailboxes imap_getsubscribed imap_header imap_headerinfo imap_headers imap_last_error imap_list imap_listmailbox imap_listscan imap_listsubscribed imap_lsub imap_mail_compose imap_mail_copy imap_mail_move imap_mail imap_mailboxmsginfo imap_mime_header_decode imap_msgno imap_num_msg imap_num_recent imap_open imap_ping imap_qprint imap_renamemailbox imap_reopen imap_rfc822_parse_adrlist imap_rfc822_parse_headers imap_rfc822_write_address imap_savebody imap_scanmailbox imap_search imap_set_quota imap_setacl imap_setflag_full imap_sort imap_status imap_subscribe imap_thread imap_timeout imap_uid imap_undelete imap_unsubscribe imap_utf7_decode imap_utf7_encode imap_utf8 |