我有一個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