2015-06-13 56 views
0

我有一个for循环,它使用PHP的IMAP函数从电子邮件中提取附件。这适用于一个附件,但它无法从单个邮件中获取多个附件。见下面的代码 -项目在for循环中的PHP数组中没有正确索引

for ($i = 0; $i < $count; $i++) { 
    $attachments[$i] = array('is_attachment' => FALSE); 
    if ($email['structure']->parts[$i]->ifdparameters) { 
    foreach ($email['structure']->parts[$i]->dparameters as $object) { 
     if (strtolower($object->attribute) == 'filename') { 
     $attachments[$i]['is_attachment'] = TRUE; 
     $attachments[$i]['filename'] = $object->value; 
     } 
    } 
    } 
    if ($email['structure']->parts[$i]->ifparameters) { 
    foreach ($email['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']) { 
    $attachments[$i]['attachment'] = imap_fetchbody($this->conn, $email['index'], $i+1);  
    $attachments[$i]['attachment'] = base64_decode($attachments[$i]['attachment']);      
    } 
    error_log(print_r($attachments[$i], TRUE)); 
    error_log(print_r($attachments, TRUE)); 
} 

看来,第二个附件未正确添加到数组的索引。我的错误记录在每个值(0,1,2)处显示$ attachment [$ i]的值,但$ attachment只包含2个索引(0,1)。第一个是空白值(电子邮件的一部分),第二个和第三个是附件。请参见下面的示例错误日志输出 -

[13-Jun-2015 16:19:54 Europe/Berlin] Array ([is_attachment] =>) 
[13-Jun-2015 16:19:54 Europe/Berlin] Array ([0] => Array ([is_attachment] =>)) 
[13-Jun-2015 16:19:55 Europe/Berlin] Array (
    [is_attachment] => 1 
    [filename] => 2015-06-12_1048.png 
    [name] => 2015-06-12_1048.png 
    [attachment] => ‰PNG 
[13-Jun-2015 16:19:55 Europe/Berlin] Array ( 
    [0] => Array ([is_attachment] =>) 
    [1] => Array (
    [is_attachment] => 1 
    [filename] => 2015-06-12_1048.png 
    [name] => 2015-06-12_1048.png 
    [attachment] => ‰PNG 
[13-Jun-2015 16:19:55 Europe/Berlin] Array (
    [is_attachment] => 1 
    [filename] => 5812548c-d445-4a18-a56d-e2698fdfd99b.jpg 
    [name] => 5812548c-d445-4a18-a56d-e2698fdfd99b.jpg 
    [attachment] => ÿØÿà 
[13-Jun-2015 16:19:55 Europe/Berlin] Array ( 
    [0] => Array ([is_attachment] =>) 
    [1] => Array (
    [is_attachment] => 1 
    [filename] => 2015-06-12_1048.png 
    [name] => 2015-06-12_1048.png 
    [attachment] => ‰PNG 

正如你可以看到,第三项,$附件[2]是一个数组[附件] =>ÿØÿà,但它不被添加到阵列当我打印$附件。我真的很茫然,为什么当它打印$附件[$ i]而不是$附件时显示。有任何想法吗?

更新:由于二进制文件+可能为空字符,错误日志记录被破坏。问题仍然存在,我不能拉多个附件。我将$ attachments数组中的二进制文件保存到磁盘,并且只保存一个附件,而不是两者。为什么只能保存第一个二进制文件?

+1

您是否注意到某些右括号丢失,即每个'['attachment']'值后?我的猜测是这些文件中有一个空字符(机会相当高,因为它们是二进制文件)干扰了C字符串,这会打破错误日志记录。什么'error_log('数组长度:'.count($ attachments));'yield,如果你把它放在循环之后?或者,您可以尝试使用'base64_decode'注释行。 – Siguza

+0

我注意到,直到最近,但不知道这意味着什么。我不知道空字符+二进制文件的高概率会打破错误记录。你真的明白了。 – Jimbob

+0

所以......你能否注释掉包含'base64_decode'的行(因为这样错误日志不应该中断),生成一个新的错误日志并在这里发布? – Siguza

回答

1

好吧,我张贴此作为一个答案的话,这样回答可以打上这样一个问题:

这似乎是一个纯粹的视觉错误。
您提供的错误日志似乎是不完整的,在任何[attachment] =>似乎被切断之后的所有输出(应至少有关闭括号才能关闭Array (...,对不对?)。
这很可能是由

  1. 那些含有一个空字符(\0),这是相当容易一定长度的二进制文件的文件引起的。
  2. 错误处理程序不使用字节数组,而是C型字符串,其末尾由所述空字符指示。

因此,当记录数据时,它似乎被破坏,实际上,它就好了。

相关问题