/** * move messages on imap server * * @param array $_uids * @param string $_targetFolderName * @param Expressomail_Backend_ImapProxy $_imap * * @todo perhaps we should check the existance of the messages on the imap instead of catching the exceptions here */ protected function _moveBatchOfMessages($_uids, $_targetFolderName, Expressomail_Backend_ImapProxy $_imap) { if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) { Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' Move ' . count($_uids) . ' messages to folder ' . $_targetFolderName . ' on imap server'); } try { $_imap->copyMessage($_uids, Expressomail_Model_Folder::encodeFolderName($_targetFolderName)); $_imap->addFlags($_uids, array(Zend_Mail_Storage::FLAG_DELETED)); } catch (Zend_Mail_Storage_Exception $zmse) { if (Tinebase_Core::isLogLevel(Zend_Log::NOTICE)) { Tinebase_Core::getLogger()->notice(__METHOD__ . '::' . __LINE__ . ' ' . $zmse); } } catch (Expressomail_Exception_IMAP $fei) { if (Tinebase_Core::isLogLevel(Zend_Log::NOTICE)) { Tinebase_Core::getLogger()->notice(__METHOD__ . '::' . __LINE__ . ' ' . $fei); } } }
/** * get imap backend and folder (and select folder) * * @param string $_folderId * @param Expressomail_Backend_Folder &$_folder * @param boolean $_select * @param Expressomail_Backend_ImapProxy $_imapBackend * @throws Expressomail_Exception_IMAPServiceUnavailable * @throws Expressomail_Exception_IMAPFolderNotFound * @return Expressomail_Backend_ImapProxy */ protected function _getBackendAndSelectFolder($_folderId = NULL, &$_folder = NULL, $_select = TRUE, Expressomail_Backend_ImapProxy $_imapBackend = NULL) { if ($_folder === NULL || empty($_folder)) { $folderBackend = new Expressomail_Backend_Folder(); $_folder = $folderBackend->get($_folderId); } try { $imapBackend = $_imapBackend === NULL ? Expressomail_Backend_ImapFactory::factory($_folder->account_id) : $_imapBackend; if ($_select) { if (Tinebase_Core::isLogLevel(Zend_Log::TRACE)) { Tinebase_Core::getLogger()->trace(__METHOD__ . '::' . __LINE__ . ' Select folder ' . $_folder->globalname); } $backendFolderValues = $imapBackend->selectFolder(Expressomail_Model_Folder::encodeFolderName($_folder->globalname)); } } catch (Zend_Mail_Storage_Exception $zmse) { // @todo remove the folder from cache if it could not be found on the IMAP server? throw new Expressomail_Exception_IMAPFolderNotFound($zmse->getMessage()); } catch (Zend_Mail_Protocol_Exception $zmpe) { throw new Expressomail_Exception_IMAPServiceUnavailable($zmpe->getMessage()); } return $imapBackend; }
/** * get Syncroton_Model_Folder folders recursively by parentFolder * * @param Expressomail_Model_Folder $parentFolder * @param array $result * @return array of Syncroton_Model_Folder */ protected function _getFolders($parentFolder = NULL, &$result = array()) { $globalname = $parentFolder ? $parentFolder->globalname : ''; $account = $this->_getAccount(); if (!$account) { return array(); } $filter = new Expressomail_Model_FolderFilter(array(array('field' => 'globalname', 'operator' => 'startswith', 'value' => $globalname), array('field' => 'account_id', 'operator' => 'equals', 'value' => $account->getId()))); try { $folders = Expressomail_Controller_Folder::getInstance()->search($filter); } catch (Expressomail_Exception_IMAPInvalidCredentials $feiic) { Tinebase_Exception::log($feiic, null, array('accountname' => $account->name)); return array(); } if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) { Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . " Found " . count($folders) . ' subfolders of folder "' . $globalname . '"'); } foreach ($folders as $folder) { if (!$folder->is_selectable) { continue; } $serverId = md5($folder->getId()); $result[$serverId] = new Syncroton_Model_Folder(array('serverId' => $serverId, 'parentId' => $parentFolder ? md5($parentFolder->getId()) : 0, 'displayName' => substr($folder->localname, 0, 254), 'type' => $this->_getFolderType($folder), 'bigfolderid' => $folder->getId())); if ($folder->has_children) { $this->_getFolders($folder, $result); } } return $result; }
/** * delete all messages in one folder -> be careful, they are completly removed and not moved to trash * -> delete subfolders if param set * * @param string $_folderId * @param boolean $_deleteSubfolders * @return Expressomail_Model_Folder * @throws Expressomail_Exception_IMAPServiceUnavailable */ public function emptyFolder($_folderId, $_deleteSubfolders = FALSE) { $folder = $this->_backend->get($_folderId); $account = Expressomail_Controller_Account::getInstance()->get($folder->account_id); if ($folder) { $cache = Tinebase_Core::getCache(); $cacheKey = 'Expressomail_Model_Folder_' . $folder->id; $cache->remove($cacheKey); } $imap = Expressomail_Backend_ImapFactory::factory($account); try { // try to delete messages in imap folder Tinebase_Core::getLogger()->info(__METHOD__ . '::' . __LINE__ . ' Delete all messages in folder ' . $folder->globalname); $imap->emptyFolder(Expressomail_Model_Folder::encodeFolderName($folder->globalname)); } catch (Zend_Mail_Protocol_Exception $zmpe) { Tinebase_Core::getLogger()->warn(__METHOD__ . '::' . __LINE__ . ' ' . $zmpe->getMessage()); throw new Expressomail_Exception_IMAPServiceUnavailable($zmpe->getMessage()); } catch (Zend_Mail_Storage_Exception $zmse) { Tinebase_Core::getLogger()->warn(__METHOD__ . '::' . __LINE__ . ' Folder could be empty (' . $zmse->getMessage() . ')'); } if ($_deleteSubfolders) { $this->deleteSubfolders($folder); } return $folder; }
/** * Creates new entry * * @param Tinebase_Record_Interface $_record * @return Tinebase_Record_Interface * @throws Tinebase_Exception_InvalidArgument * @throws Tinebase_Exception_UnexpectedValue * * @todo remove autoincremental ids later */ public function create(Tinebase_Record_Interface $_record) { $folder = $_record->toArray(); $return = $this->get($this->encodeFolderUid(Expressomail_Model_Folder::encodeFolderName($folder['globalname']), $folder['account_id']), FALSE); return $return; }
/** * create new system folder * * @param Expressomail_Model_Account $_account * @param string $_systemFolder * @return Expressomail_Model_Folder */ protected function _createSystemFolder(Expressomail_Model_Account $_account, $_systemFolder) { Tinebase_Core::getLogger()->notice(__METHOD__ . '::' . __LINE__ . ' Folder not found: ' . $_systemFolder . '. Trying to add it.'); $splitFolderName = Expressomail_Model_Folder::extractLocalnameAndParent($_systemFolder, $_account->delimiter); try { $result = Expressomail_Controller_Folder::getInstance()->create($_account, $splitFolderName['localname'], $splitFolderName['parent']); } catch (Expressomail_Exception_IMAPServiceUnavailable $feisu) { if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) { Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' ' . $feisu->getMessage()); } // try again with INBOX as parent because some IMAP servers can not handle namespaces correctly $result = Expressomail_Controller_Folder::getInstance()->create($_account, $splitFolderName['localname'], 'INBOX'); } return $result; }
/** * Get Ids for filter * @param array $imapFilters * @param Tinebase_Model_Pagination $_pagination * @return array * * @todo pass the search parameters */ protected function _getIds(array $_imapFilters, Tinebase_Model_Pagination $_pagination = NULL) { $messages = array(); if (empty($_imapFilters['paths'])) { $_imapFilters['paths'] = $this->_getAllFolders(); } $sort = $this->_getImapSortParams($_pagination); // do a search for each path on $imapFilters foreach ($_imapFilters['paths'] as $folderId => $path) { list($accountId, $mailbox) = $path; $imap = Expressomail_Backend_ImapFactory::factory($accountId); $imap->selectFolder(Expressomail_Model_Folder::encodeFolderName($mailbox)); // TODO: pass the search parameter too. $messages[$folderId] = $imap->sort((array) $sort, (array) $_imapFilters['filters']); } return $messages; }
/** * search message by header (X-Tine20TestMessage) and add it to cache * * @param string $_testHeaderValue * @param Expressomail_Model_Folder $_folder * @param boolean $assert * @param string $testHeader * @return Expressomail_Model_Message|NULL */ public function searchAndCacheMessage($_testHeaderValue, $_folder = NULL, $assert = TRUE, $testHeader = 'X-Tine20TestMessage') { $folder = $_folder !== NULL ? $_folder : $this->_folder; $message = $this->_searchMessage($_testHeaderValue, $folder, $assert, $testHeader); if ($message === NULL && !$assert) { return NULL; } // $cachedMessage = $this->_cache->addMessage($message, $folder); // if ($cachedMessage === FALSE) { // // try to add message again (it had a duplicate) // $this->_cache->clear($folder); // $cachedMessage = $this->_cache->addMessage($message, $folder); // } // // if ($assert) { // $this->assertTrue($cachedMessage instanceof Expressomail_Model_Message, 'could not add message to cache'); // } // // $this->_createdMessages->addRecord($cachedMessage); // // return $cachedMessage; $expressoMessage = new Expressomail_Model_Message(array('account_id' => $_folder->account_id, 'messageuid' => $message['uid'], 'folder_id' => $_folder->getId(), 'timestamp' => Tinebase_DateTime::now(), 'received' => Expressomail_Message::convertDate($message['received']), 'size' => $message['size'], 'flags' => $message['flags'])); $expressoMessage->parseStructure($message['structure']); $expressoMessage->parseHeaders($message['header']); $expressoMessage->parseBodyParts(); $attachments = Expressomail_Controller_Message::getInstance()->getAttachments($expressoMessage); $expressoMessage->has_attachment = count($attachments) > 0 ? true : false; return $expressoMessage; }
/** * Tears down the fixture * This method is called after a test is executed. * * @access protected */ protected function tearDown() { if (count($this->_createdFolders) > 0) { foreach ($this->_createdFolders as $folderName) { //echo "delete $folderName\n"; try { $this->_imap->removeFolder(Expressomail_Model_Folder::encodeFolderName($folderName)); } catch (Zend_Mail_Storage_Exception $zmse) { // already deleted } } //No necessary with Expressomail // Expressomail_Controller_Cache_Folder::getInstance()->clear($this->_account); } if (!empty($this->_foldersToClear)) { foreach ($this->_foldersToClear as $folderName) { // delete test messages from given folders on imap server (search by special header) $this->_imap->selectFolder($folderName); $result = $this->_imap->search(array('HEADER X-Tine20TestMessage jsontest')); //print_r($result); foreach ($result as $messageUid) { $this->_imap->removeMessage($messageUid); } // clear message cache $folder = Expressomail_Controller_Folder::getInstance()->getByBackendAndGlobalName($this->_account->getId(), $folderName); //No necessary with Expressomail // Expressomail_Controller_Cache_Message::getInstance()->clear($folder); } } // sieve cleanup if ($this->_testSieveScriptName !== NULL) { Expressomail_Controller_Sieve::getInstance()->setScriptName($this->_testSieveScriptName); try { Expressomail_Controller_Sieve::getInstance()->deleteScript($this->_account->getId()); } catch (Zend_Mail_Protocol_Exception $zmpe) { // do not delete script if active } Expressomail_Controller_Account::getInstance()->setVacationActive($this->_account, $this->_oldSieveVacationActiveState); if ($this->_oldSieveData !== NULL) { $this->_oldSieveData->save(); } } if ($this->_oldActiveSieveScriptName !== NULL) { Expressomail_Controller_Sieve::getInstance()->setScriptName($this->_oldActiveSieveScriptName); Expressomail_Controller_Sieve::getInstance()->activateScript($this->_account->getId()); } // vfs cleanup foreach ($this->_pathsToDelete as $path) { $webdavRoot = new Sabre_DAV_ObjectTree(new Tinebase_WebDav_Root()); //echo "delete $path"; $webdavRoot->delete($path); } }