2024年PHP日本大会

imap_getmailboxes

(PHP 4, PHP 5, PHP 7, PHP 8)

imap_getmailboxes读取邮箱列表,返回每个邮箱的详细信息

描述

imap_getmailboxes(IMAP\Connection $imap, string $reference, string $pattern): array|false

获取邮箱信息。

参数

imap

一个IMAP\Connection 实例。

reference

reference 通常应该只是imap_open()中描述的服务器规范。

警告

除非禁用了imap.enable_insecure_rsh,否则将不受信任的数据传递给此参数是不安全的。

pattern

指定在邮箱层次结构中从何处开始搜索。

您可以将两个特殊字符作为pattern的一部分传递:'*' 和 '%'。'*' 表示返回所有邮箱。如果您将pattern作为'*'传递,您将获得整个邮箱层次结构的列表。'%' 表示仅返回当前级别。'%' 作为pattern参数将只返回顶级邮箱;在UW_IMAPD上使用'~/mail/%' 将返回~/mail目录中的每个邮箱,但不返回该目录子文件夹中的任何邮箱。

返回值

返回一个包含邮箱信息的数组对象。每个对象都具有属性name,指定邮箱的全名;delimiter,它是此邮箱所属层次结构部分的层次结构分隔符;以及attributesAttributes是一个位掩码,可以针对其进行测试

  • LATT_NOINFERIORS - 此邮箱不包含,并且可能不包含任何“子邮箱”(此邮箱下方没有邮箱)。调用imap_createmailbox() 将无法在此邮箱上运行。

  • LATT_NOSELECT - 这只是一个容器,而不是邮箱 - 您无法打开它。

  • LATT_MARKED - 此邮箱已标记。这意味着自上次检查以来,它可能包含新邮件。并非所有IMAP服务器都提供此功能。

  • LATT_UNMARKED - 此邮箱未标记,不包含新邮件。如果提供了MARKEDUNMARKED,您可以假设IMAP服务器支持此邮箱的此功能。

  • LATT_REFERRAL - 此容器具有对远程邮箱的引用。

  • LATT_HASCHILDREN - 此邮箱具有可选择的子邮箱。

  • LATT_HASNOCHILDREN - 此邮箱没有可选择的子邮箱。

如果失败,则函数返回false

变更日志

版本 描述
8.1.0 imap参数现在期望一个IMAP\Connection实例;以前,期望一个有效的imap 资源

示例

示例 #1 imap_getmailboxes() 示例

<?php
$mbox
= imap_open("{imap.example.org}", "username", "password", OP_HALFOPEN)
or die(
"can't connect: " . imap_last_error());

$list = imap_getmailboxes($mbox, "{imap.example.org}", "*");
if (
is_array($list)) {
foreach (
$list as $key => $val) {
echo
"($key) ";
echo
imap_utf7_decode($val->name) . ",";
echo
"'" . $val->delimiter . "',";
echo
$val->attributes . "<br />\n";
}
} else {
echo
"imap_getmailboxes failed: " . imap_last_error() . "\n";
}

imap_close($mbox);
?>

参见

添加注释

用户贡献的注释 3 条注释

Mohamed Abbas mabbas_xyz at yahoo dot com
18年前
我目前正在开发一个简单的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
foom at fuhm dot NO_supercalifragilisticexpialidocious_SPAM dot net
23年前
本文档中邮箱属性列表非常具有误导性。特别是对noinferiors的解释是错误的。它并不意味着邮箱当前没有子邮箱,而是意味着它*永远*不可能有子邮箱。此外,marked和unmarked并非仅被UW-IMAP使用是不正确的。它们在官方IMAP规范中,并且至少Courier-imap也使用它们。

然而,需要注意的是,损坏的IMAP服务器确实会发送\Noinferiors来表示当前没有子邮箱。

来自IMAP4rev1规范 (RFC 2060)
\Noinferiors

任何层次结构的子级别都不可能存在
在此名称下;现在不存在子级别,将来也无法
创建。

\Noselect

无法将此名称用作可选邮箱。

\Marked

邮箱已被服务器标记为“有趣”;
邮箱可能包含自
上次选择邮箱以来添加的消息。

\Unmarked

邮箱自
上次选择邮箱以来不包含任何附加消息。
ad-rotator.com
20年前
如果你使用print_r()或var_dump()打印对象并看到属性的整数,这些是位掩码的常量整数。

1 LATT_NOINFERIORS
2 LATT_NOSELECT
4 LATT_MARKED
8 LATT_UNMARKED
To Top