我有一个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数组中的二进制文件保存到磁盘,并且只保存一个附件,而不是两者。为什么只能保存第一个二进制文件?
您是否注意到某些右括号丢失,即每个'['attachment']'值后?我的猜测是这些文件中有一个空字符(机会相当高,因为它们是二进制文件)干扰了C字符串,这会打破错误日志记录。什么'error_log('数组长度:'.count($ attachments));'yield,如果你把它放在循环之后?或者,您可以尝试使用'base64_decode'注释行。 – Siguza
我注意到,直到最近,但不知道这意味着什么。我不知道空字符+二进制文件的高概率会打破错误记录。你真的明白了。 – Jimbob
所以......你能否注释掉包含'base64_decode'的行(因为这样错误日志不应该中断),生成一个新的错误日志并在这里发布? – Siguza