如何在php中从电子邮件附件中检索附件消息?

如何在php中从电子邮件附件中检索附件消息?,php,email,imap,Php,Email,Imap,我正在使用下面的代码使用imap_fetchstructure从电子邮件中检索附件。该代码适用于图像、文件等普通附件,但不适用于Outlook项目。请参阅下面的代码: $this->msg_cnt = imap_num_msg($this->conn); $this->TOTAL_MESSAGES = $this->msg_cnt; $msgs = imap_sort($this->conn, SORTDATE, 1

我正在使用下面的代码使用imap_fetchstructure从电子邮件中检索附件。该代码适用于图像、文件等普通附件,但不适用于Outlook项目。请参阅下面的代码:

        $this->msg_cnt = imap_num_msg($this->conn);
        $this->TOTAL_MESSAGES = $this->msg_cnt;

        $msgs = imap_sort($this->conn, SORTDATE, 1, SE_UID);

        $in = array();
        $inctr = 0;
        foreach ($msgs as $msguid)
        {
            $msgno = imap_msgno($this->conn, $msguid);
            $has_attachment = false;
            $ATT_FILES = "";
            $attachment_value = "";
            $file_name = "";

            $structure = imap_fetchstructure($this->conn, $msgno);
           $attachments = array();
           $log = "Attachments:\r\n\r\n";
            if(isset($structure->parts) && count($structure->parts))
            {
                 for($i = 0; $i < count($structure->parts); $i++)
                 {
                    $attachments[$i] = array
                    (
                      'is_attachment' => false,
                      'filename' => '',
                      'name' => '',
                      'attachment' => ''
                    );

                    if($structure->parts[$i]->ifdparameters)
                    {
                        foreach($structure->parts[$i]->dparameters as $object)
                        {
                            if(strtolower($object->attribute) == 'filename')
                            {
                                $attachments[$i]['is_attachment'] = true;
                                $attachments[$i]['filename'] = $object->value;
                            }
                        }
                    }

                    if($structure->parts[$i]->ifparameters)
                    {
                        foreach($structure->parts[$i]->parameters as $object)
                        {
                            if(strtolower($object->attribute) == 'name')
                            {
                                $attachments[$i]['is_attachment'] = true;
                                $attachments[$i]['name'] = $object->value;
                            }
                        }
                    }

                    if($attachments[$i]['is_attachment'])
                    {
                        $has_attachment = true;
                        $attachments[$i]['attachment'] = imap_fetchbody($this->conn, $msgno, $i+1);
                        if($structure->parts[$i]->encoding == 3)
                        { // 3 = BASE64
                            $result = "Found file attachment (QUOTED-PRINTABLE).\r\n\r\n";
                            file_put_contents("/var/www/html/attachment_logs.txt", $result, FILE_APPEND);
                            $attachments[$i]['attachment'] = base64_decode($attachments[$i]['attachment']);
                        }
                        elseif($structure->parts[$i]->encoding == 4)
                        { // 4 = QUOTED-PRINTABLE
                            ob_start();
                            echo "QUOTED-PRINTED FOUND. CONTENT:\r\n";
                            var_dump($attachments[$i]);
                            $result = ob_get_clean();
                            file_put_contents("/var/www/html/attachment_logs.txt", $result, FILE_APPEND);
                            $result = "Found email attachment (QUOTED-PRINTABLE).\r\n\r\n";
                            file_put_contents("/var/www/html/attachment_logs.txt", $result, FILE_APPEND);

                            $attachments[$i]['attachment'] = quoted_printable_decode($attachments[$i]['attachment']);
                        }
                        $attachment_value = $attachments[$i]['attachment'];
                        if (empty($attachments[$i]['filename']))
                            $attachments[$i]['filename'] = "".time()."";
                        $file_name = $attachments[$i]['filename'];
                        $folder = "/var/www/html/dvxcss/attachments/";
                        if (!file_exists($folder))
                        {
                            mkdir($folder);
                        }

                        //WRITE THE ATTACHMENT
                        ob_start();
                        var_dump($attachments);
                        $log .= ob_get_clean();
                        $log .= "\r\n\r\n#################################\r\n";
                        file_put_contents("/var/www/html/attachment_logs.txt", $log, FILE_APPEND);
                        $ATT_FILES .= $file_name.";";
                        file_put_contents($folder.$file_name, $attachment_value);
                    }             
                }
            }

            $in[$inctr] = array (
                'index'     => $inctr,
                'header'    => imap_headerinfo($this->conn, $msgno),
                'body' => $this->getBody($msguid, $this->conn),
                'structure' => imap_fetchstructure($this->conn, $msgno),
                'hasattachment' => $has_attachment,
                'attachment' => "$file_name",
                'attfiles' => $ATT_FILES
            );
            $inctr++;
        }
代码获取附件的文件名并将其写入服务器

问题:

如何使用php获取Outlook的电子邮件附件

任何帮助都将不胜感激。谢谢

更新:

发现它们是.eml文件。outlook将这些项目附加为.eml文件。我尝试使用gmail进行检查,它得到一个名为noname.eml的文件

更新:

它被称为message/rfc822或text/rfc822 bodypart