要使用imap_fetchbody()
获取消息正文的特定部分,您必须传递与IMAP部件号相关且为defined as follow in the PHP documentation的section
参数:
我唯一的线索是使用imap_fetchstructure()
读取特定消息的结构。但是,我不知道如何从中推导出零件号。
编辑
对于对IMAPv4规范感兴趣的人,请在here is the paragraph about fetching中提及部件号。不幸的是,它没有明确说明如何获取或计算它们。
最佳答案
没错,您必须使用imap_fetchstructure()
函数的结果。
您可以使用以下功能获取邮件各部分的完整 list :
function getPartList($struct, $base="") {
$res=Array();
if (!property_exists($struct,"parts")) {
return [$base?:"0"];
} else {
$num=1;
if (count($struct->parts)==1) return getPartList($struct->parts[0], $base);
foreach ($struct->parts as $p=>$part) {
foreach (getPartList($part, $p+1) as $subpart) {
$res[]=($base?"$base.":"").$subpart;
}
}
}
return $res;
}
$struct=imap_fetchstructure($mbox, $i);
$res=getPartList($struct);
print_r($res);
Result:
Array(
[0] => 1
[1] => 2
[2] => 3.1
[3] => 3.2
[4] => 4.1
[5] => 4.2
);
编辑:请注意,您的服务器可能无法处理RFC822子部分
例如,在Dovecot v2.2服务器上,它返回一个空字符串
telnet imapserver.com 143
a1 LOGIN [email protected] password
a2 SELECT "Inbox"
a3 FETCH 522 (BODY[3.1.2])
// result:
* 522 FETCH (BODY[3.1.2] {0}
)
a3 OK Fetch completed.
a4 logout
EDIT2:似乎只有一个部分的子部分不算在内...请参阅修改后的代码