/** * get attachments of message * * @param array $_structure * @return array */ public function getAttachments($_messageId, $_partId = null) { if (!$_messageId instanceof Felamimail_Model_Message) { $message = $this->_backend->get($_messageId); } else { $message = $_messageId; } $structure = $message->getPartStructure($_partId); $attachments = array(); if (!isset($structure['parts'])) { return $attachments; } foreach ($structure['parts'] as $part) { if (Tinebase_Core::isLogLevel(Zend_Log::TRACE)) { Tinebase_Core::getLogger()->trace(__METHOD__ . '::' . __LINE__ . ' ' . print_r($part, TRUE)); } if ($part['type'] == 'multipart') { $attachments = $attachments + $this->getAttachments($message, $part['partId']); } else { $filename = $this->_getAttachmentFilename($part); if ($part['type'] == 'text' && (!is_array($part['disposition']) || $part['disposition']['type'] == Zend_Mime::DISPOSITION_INLINE && !(isset($part['disposition']["parameters"]) || array_key_exists("parameters", $part['disposition'])))) { if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) { Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' Skipping DISPOSITION_INLINE attachment with name ' . $filename); } if (Tinebase_Core::isLogLevel(Zend_Log::TRACE)) { Tinebase_Core::getLogger()->trace(__METHOD__ . '::' . __LINE__ . ' part: ' . print_r($part, TRUE)); } continue; } $expanded = array(); // if a winmail.dat exists, try to expand it if (preg_match('/^winmail[.]*\\.dat/i', $filename) && Tinebase_Core::systemCommandExists('tnef')) { if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) { Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' Got winmail.dat attachment (contentType=' . $part['contentType'] . '). Trying to extract files ...'); } if ($part['contentType'] == 'application/ms-tnef' || $part['contentType'] == 'text/plain') { $expanded = $this->_expandWinMailDat($_messageId, $part['partId']); if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) { Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' Extracted ' . count($expanded) . ' files from ' . $filename); } if (!empty($expanded)) { $attachments = array_merge($attachments, $expanded); } } } // if its not a winmail.dat, or the winmail.dat couldn't be expanded // properly because it has richtext embedded, return attachment as it is if (empty($expanded)) { $attachmentData = array('content-type' => $part['contentType'], 'filename' => $filename, 'partId' => $part['partId'], 'size' => $part['size'], 'description' => $part['description'], 'cid' => !empty($part['id']) ? $part['id'] : NULL); if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) { Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' Got attachment with name ' . $filename); } $attachments[] = $attachmentData; } } } return $attachments; }
/** * test search with cache * - test text_plain.eml message * - test from header */ public function testSearchWithCache() { // get inbox folder id Felamimail_Controller_Cache_Folder::getInstance()->update($this->_account->getId()); $folderBackend = new Felamimail_Backend_Folder(); $folder = Felamimail_Controller_Folder::getInstance()->getByBackendAndGlobalName($this->_account->getId(), $this->_testFolderName); // clear cache and empty folder $this->_cache->clear($folder->getId()); Felamimail_Controller_Folder::getInstance()->emptyFolder($folder->getId()); // append message $this->_appendMessage('text_plain.eml', $this->_folder); // search messages in test folder $this->_cache->updateCache($folder); $result = $this->_controller->search($this->_getFilter($folder->getId())); //print_r($result->toArray()); // check result $firstMessage = $result->getFirstRecord(); $this->_createdMessages->addRecord($firstMessage); $this->assertGreaterThan(0, count($result)); $this->assertEquals($folder->getId(), $firstMessage->folder_id); $this->assertEquals("Re: [gentoo-dev] `paludis --info' is not like `emerge --info'", $firstMessage->subject); $this->assertEquals('Pipping, Sebastian (Luxembourg)', $firstMessage->from_name); $this->assertEquals('*****@*****.**', $firstMessage->from_email); $this->assertEquals(array('*****@*****.**', '*****@*****.**'), $firstMessage->to); // check cache entries $cacheBackend = new Felamimail_Backend_Cache_Sql_Message(); $cachedMessage = $cacheBackend->get($firstMessage->getId()); $this->assertEquals($folder->getId(), $cachedMessage->folder_id); $this->assertEquals(Tinebase_DateTime::now()->format('Y-m-d'), $cachedMessage->timestamp->format('Y-m-d')); // clear cache $this->_cache->clear($folder->getId()); }