/** * delete messages from cache * * @param array $_ids * @param Expressomail_Model_Folder $_folder * @return integer number of removed messages */ protected function _deleteMessagesByIdAndUpdateCounters($_ids, Expressomail_Model_Folder $_folder) { if (count($_ids) == 0) { if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) { Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' No messages to delete.'); } return 0; } $decrementMessagesCounter = 0; $decrementUnreadCounter = 0; if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) { Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' Delete ' . count($_ids) . ' messages'); } $messagesToBeDeleted = $this->_backend->getMultiple($_ids); foreach ($messagesToBeDeleted as $messageToBeDeleted) { $this->_backend->delete($messageToBeDeleted); $_folder->cache_job_actions_done++; $decrementMessagesCounter++; if (!$messageToBeDeleted->hasSeenFlag()) { $decrementUnreadCounter++; } } $_folder = Expressomail_Controller_Folder::getInstance()->updateFolderCounter($_folder, array('cache_totalcount' => "-{$decrementMessagesCounter}", 'cache_unreadcount' => "-{$decrementUnreadCounter}")); return $decrementMessagesCounter; }
/** * add to/cc/bcc and flags custom filters * * @param Zend_Db_Select $_select * @param Expressomail_Backend_Message $_backend * @param array $_filterData * @return void */ protected function _addRecipientAndFlagsSql($_select, $_backend, $_filterData) { $db = $_backend->getAdapter(); $foreignTables = $_backend->getForeignTables(); // add conditions $tablename = $foreignTables[$_filterData['field']]['table']; if ($_filterData['field'] !== 'flags') { $fieldName = $tablename . '.name'; $fieldEmail = $tablename . '.email'; } // add filter value if (!is_array($_filterData['value'])) { $value = '%' . $_filterData['value'] . '%'; } else { $value = array(); foreach ((array) $_filterData['value'] as $customValue) { $value[] = '%' . $customValue . '%'; } } if ($_filterData['field'] == 'flags') { if ($_filterData['operator'] == 'equals' || $_filterData['operator'] == 'contains') { $_select->having($db->quoteInto('flags LIKE ?', $value)); } else { if ($_filterData['operator'] == 'in' || $_filterData['operator'] == 'notin') { if (empty($value)) { $whereString = 'flags IS NULL'; } else { $value = (array) $value; $where = array(); $op = $_filterData['operator'] == 'in' ? 'LIKE' : 'NOT LIKE'; $opImplode = $_filterData['operator'] == 'in' ? ' OR ' : ' AND '; foreach ($value as $flag) { $where[] = $db->quoteInto('flags ' . $op . ' ?', $flag); } $whereString = implode($opImplode, $where); if ($_filterData['operator'] == 'notin') { $whereString = '(' . $whereString . ') OR flags IS NULL'; } } $_select->having($whereString); } else { $_select->having($db->quoteInto('flags NOT LIKE ? OR flags IS NULL', $value)); } } } else { $_select->where($db->quoteInto($fieldName . ' LIKE ?', $value) . ' OR ' . $db->quoteInto($fieldEmail . ' LIKE ?', $value)); } }
/** * save message in folder (target folder can be within a different account) * * @param string|Expressomail_Model_Folder $_folder globalname or folder record * @param Expressomail_Model_Message $_message * @return Expressomail_Model_Message */ public function saveMessageInFolder($_folder, $_message) { $sourceAccount = Expressomail_Controller_Account::getInstance()->get($_message->account_id); $folder = $_folder instanceof Expressomail_Model_Folder ? $_folder : Expressomail_Controller_Folder::getInstance()->getByBackendAndGlobalName($_message->account_id, $_folder); $targetAccount = $_message->account_id == $folder->account_id ? $sourceAccount : Expressomail_Controller_Account::getInstance()->get($folder->account_id); $this->_resolveOriginalMessage($_message); $mailToAppend = $this->createMailForSending($_message, $sourceAccount); $transport = new Expressomail_Transport(); $mailAsString = $transport->getRawMessage($mailToAppend, $this->_getAdditionalHeaders($_message)); $flags = $folder->globalname === $targetAccount->drafts_folder ? array(Zend_Mail_Storage::FLAG_DRAFT) : null; if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) { Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' Appending message ' . $_message->subject . ' to folder ' . $folder->globalname . ' in account ' . $targetAccount->name); } if (Tinebase_Core::isLogLevel(Zend_Log::TRACE)) { Tinebase_Core::getLogger()->trace(__METHOD__ . '::' . __LINE__ . ' ' . $mailAsString); } try { Expressomail_Backend_ImapFactory::factory($targetAccount)->appendMessage($mailAsString, $folder->globalname, $flags); } catch (Zend_Mail_Protocol_Exception $e) { if ($folder->system_folder) { Expressomail_Backend_ImapFactory::factory($targetAccount)->createFolder($folder->localname, $folder->parent); Expressomail_Backend_ImapFactory::factory($targetAccount)->appendMessage($mailAsString, $folder->globalname, $flags); } else { throw $e; } } // update original_id of saved message $res = Expressomail_Backend_ImapFactory::factory($targetAccount)->examineFolder($folder->globalname); $_messageid = Expressomail_Backend_Message::createMessageId($_message->account_id, $folder->id, $res['uidnext'] - 1); $_message->original_id = $_messageid; return $_message; }
/** * delete messages with given messageuids by folder (id) * * @param array $_msguids * @param mixed $_folderId * @return integer number of deleted rows or false if no message are given */ public function deleteMessageuidsByFolderId($_msguids, $_folderId) { $return = FALSE; if (!(empty($_msguids) || !is_array($_msguids))) { Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' Logicaly delete the messages ' . print_r($_msguids, true)); $return = count($_msguids); } //return $return; /** * TODO: remove the code below and uncomment the code above */ $aux = new Expressomail_Backend_Message(); $retorno = $aux->deleteMessageuidsByFolderId($_msguids, $_folderId); return $retorno; }