如何确定通过PHP IMAP函数检索的电子邮件的部件号?

Dav*_*vid 7 php imap

要获取消息正文的特定部分imap_fetchbody(),您必须传递section与IMAP部件号相关的参数,并在PHP文档中定义如下:

它是一个由句点分隔的整数字符串,它根据IMAP4规范索引到正文部分列表中

我唯一的线索是用来imap_fetchstructure()读取特定消息的结构.但是,我不知道如何从中推断出零件编号.

编辑

对于那些对IMAPv4规范感兴趣的人,这里是关于提取部件号的部分的段落.不幸的是,它没有明确说明如何获取或计算它们.

Ada*_*dam 3

你是对的,你必须使用函数的结果imap_fetchstructure()

您可以使用以下函数获取邮件的部分和子部分的完整列表:

 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
 );
Run Code Online (Sandbox Code Playgroud)

编辑:请注意,您的服务器可能无法处理 RFC822 子部分

例如在 Dovecot v2.2 服务器上,它返回一个空字符串

 telnet imapserver.com 143
 a1 LOGIN user@example.com 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
Run Code Online (Sandbox Code Playgroud)

EDIT2:似乎只有一个部分的子部分不算......请参阅修改后的代码