正在提取PHP IMAP附件


Extracting PHP IMAP attachments

你好,我有一个PHP IMAP函数,可以提取电子邮件特定正文的附件,我发现了这篇文章:http://www.linuxscope.net/articles/mailAttachmentsPHP.html但它显示了一个错误:警告:imap_bodystruct()[function.imap-bodystruct]:错误的消息编号我不知道我缺少了什么。这是我的代码

session_start();
include('settings.php');
include('vars.php');
$struct = imap_fetchstructure($mbox,$getmsgid, FT_UID);
$contentParts = count($struct->parts);
if ( $contentParts >= 2 ) {
    for ( $ii=2; $ii<=$contentParts; $ii++ ) {
        $att[$ii-2] = imap_bodystruct($mbox,$getmsgid, $ii);
        echo $ii . '<br />';
    }
for ($k=0;$k<sizeof($att);$k++) {
    if ($att[$k]->parameters[0]->value == "us-ascii" || $att[$k]->parameters[0]->value  == "US-ASCII") {
        if ($att[$k]->parameters[1]->value != "") {
            $selectBoxDisplay[$k] = $att[$k]->parameters[1]->value;
        }
    }elseif ($att[$k]->parameters[0]->value != "iso-8859-1" && $att[$k]->parameters[0]->value != "ISO-8859-1") {
        $selectBoxDisplay[$k] = $att[$k]->parameters[0]->value;
        }
    }
   }
   if (sizeof($selectBoxDisplay) > 0) {
echo "<select name='"attachments'" size='"3'" class='"tblContent'"    onChange='"handleFile(this.value)'" style='"width:170;'">";
    for ($j=0;$j<sizeof($selectBoxDisplay);$j++) {
        echo "'n<option value='"$j'">". $selectBoxDisplay[$j]    ."</option>";
    }
echo "</select>";
  }

settings.php包含我的$mbox连接,它运行良好,这里唯一的问题是imap_bodystruct($mbox,$getmsgid,$ii);我的语法有问题吗?

谢谢你,

我找到了答案:

替换来自的线路

   $att[$ii-2] = imap_bodystruct($mbox,$getmsgid, $ii);

至:

   $att[$ii-2] = imap_bodystruct($mbox, imap_msgno($mbox, $getmsgid), $ii);

显示附件,替换此行:

  if (sizeof($selectBoxDisplay) > 0) {
  echo "<select name='"attachments'" size='"3'" class='"tblContent'"    onChange='"handleFile(this.value)'" style='"width:170;'">";
   for ($j=0;$j<sizeof($selectBoxDisplay);$j++) {
    echo "'n<option value='"$j'">". $selectBoxDisplay[$j]    ."</option>";
   }
   echo "</select>";
  }

至:

  foreach($selectBoxDisplay as $attachments => $attVal){
     echo $attVal . '<br />';
  }

谢谢,

这里是通过UID获取消息。

$struct = imap_fetchstructure($mbox,$getmsgid, FT_UID);

大概当你提取身体部位时,你也需要通过UID来完成:

$att[$ii-2] = imap_fetchbody ($mbox, $getmsgid, $ii, FT_UID)

这应该通过UID和零件号获取车身零件。

您现有的呼叫$att[$ii-2] = imap_bodystruct($mbox,$getmsgid, $ii);将尝试通过与UID不同的消息序列号来获取消息。这个函数(我不清楚它的作用)似乎没有通过UID获取的选项。

还要记住,对于非常复杂的MIME消息,部分不一定是顺序的(如:1、2、3);它们可以具有子部分:1.1、1.2、2、3。如果你有一封HTML和纯文本的电子邮件,并且有一个附件,这很常见。